Разница между доступом к статическим переменным экземпляра с использованием ключевого слова this и имени класса - PullRequest
1 голос
/ 22 декабря 2010

У меня есть следующий класс Java.Когда я вызываю метод login в моем конструкторе, я обращаюсь к статической переменной экземпляра username, используя имя класса, и статической переменной экземпляра password, используя ключевое слово this.У меня вопрос, в чем разница между двумя подходами?Какой из них следует использовать в какой ситуации?

public class MyClass {
    private Main main;

    private static String username = "mylogindetails";

    private static String password = "mypassword";

    public MyClass(){
        this.main = new Main();
        this.main.login(MyClass.username, this.password);
    }


    public static void main(String args[]){
        MyClass myclass = new myclass();
    }
}

Ответы [ 8 ]

6 голосов
/ 22 декабря 2010

Они оба эквивалентны.
Однако доступ к статическим элементам с помощью this вводит в заблуждение и его следует избегать любой ценой.

3 голосов
/ 22 декабря 2010

Без разницы.

Некоторые считают, что к полю или методу static следует обращаться через имя класса, а не через this или экземпляр, чтобы подчеркнуть, что это static.Eclipse, например, имеет параметр конфигурации, чтобы пометить предупреждение о доступе статического ресурса через ссылку на экземпляр.

Мои предпочтения в следующем порядке:

  • в пределахсам класс, я бы просто сослался на поле без квалификатора

  • используйте имя класса

  • используйте this или экземпляр, только если вычувствую, что статическая природа поля / метода может измениться, и это деталь конструкции, от которой статически не должны зависеть клиенты класса (в таком случае, я бы в любом случае подумал о том, чтобы сделать его методом экземпляра, чтобы обеспечить егодоступ)

2 голосов
/ 22 декабря 2010

В этом случае нет разницы, и я думаю, что он скомпилирован в тот же байт-код (GETSTATIC).

Но MyClass.username предпочтительнее, потому что он отражает природу поля.

1 голос
/ 22 декабря 2010

С Учебник по Java: Понимание экземпляра и членов класса :

На переменные класса ссылается само имя класса, как в

Bicycle.numberOfBicycles

Это дает понять, что они являются переменными класса.

Примечание : Вы также можете ссылаться на статические поля с помощью ссылки на объект, такой как

myBike.numberOfBicycles

но это не рекомендуется, потому что не дает понять, что они являются переменными класса.

0 голосов
/ 03 сентября 2014

Вам также не нужно использовать.

Поскольку у вас есть внутренний класс, вы можете напрямую обращаться к статической переменной без явной ссылки на внешний класс или на этот

Если использование статических полей сбивает с толку, вы можете сделать их заглавными, чтобы различать их.Часто это зарезервировано для конечных статических полей, действующих как константы.

0 голосов
/ 22 декабря 2010

Ну, статические переменные не являются переменными экземпляра. Поэтому статическая переменная экземпляра не является допустимым термином.

0 голосов
/ 22 декабря 2010

Помните, что статические переменные являются общими для всех экземпляров вашего MyClass, поэтому использование этого для ссылки на них вводит в заблуждение. На самом деле это просто разница в стиле, но вы не должны иметь привычку ссылаться на это с этим.

0 голосов
/ 22 декабря 2010

Все экземпляры вашего класса используют один и тот же пароль;пароль принадлежит к классу , а не каждому экземпляру, вот что означает статическое.

Так что, хотя вы можете получить к нему доступ из любого экземпляра, такое использование не рекомендуется, так как предполагает, что пароль зависит от конкретного экземпляра.

...