Зачем включать имя класса при обращении к статической переменной? - PullRequest
7 голосов
/ 20 июля 2011

Выполняя домашнее задание по Java, я ответил на вопрос, написав метод экземпляра, в методе которого я использовал некоторые static final переменные, принадлежащие классу, в котором этот метод был. имя класса, например:

for(int i=0; i < MY_STATIC_VARIABLE; i++)

вместо

for(int i=0; i < MyClass.MY_STATIC_VARIABLE; i++)

Это скомпилировано и работает правильно. Только позже я заметил, что забыл поставить префикс имени класса. Имеет ли значение, включаю ли я имя класса или нет? Действует ли переменная static final как глобальная переменная в контексте своего класса?

Ответы [ 7 ]

8 голосов
/ 20 июля 2011

Имеет ли значение, включаю ли я имя класса или нет?

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

Для компилятора это не имеет значения.

Действует ли статическая конечная переменная как глобальная переменная в контексте ее класса?

Конечно

4 голосов
/ 20 июля 2011

Действует ли переменная static final как глобальная переменная в контексте своего класса?

Да, все члены класса static доступны по всему коду класса (final или иным образом), и им не нужно ставить префикс имени класса.Включать это или нет - предпочтение стиля.

Менее очевидно, что в методе экземпляра вы можете использовать this.MY_STATIC_VARIABLE, и компилятор будет очень доволен, даже если MY_STATIC_VARIABLE не является полем экземпляра,(С открытыми статическими полями вы можете сделать это с любой ссылкой на экземпляр, а не только с this.) Вы можете сделать то же самое с методами static.Но это ужасно вводит в заблуждение любого, кто читает код.:-) С технической точки зрения, это стиль, но я настоятельно рекомендую против этого.Просто упомяните об этом на случай, если вы в конечном итоге прочитаете код, который выглядит так, будто в нем есть ошибка.

3 голосов
/ 20 июля 2011

Как уже сказал Джои, если вы находитесь в классе, вы можете получить к нему доступ без квалификации.Однако если вы используете его из другого класса, вам следует использовать имя класса вместо экземпляра для доступа к нему, чтобы было ясно, что это статическая переменная / константа.

MyClass instance = new MyClass();
instance.MY_STATIC_VARIABLE //not good
MyClass.MY_STATIC_VARIABLE  //good
1 голос
/ 05 июня 2017

Другой тип сценария доступа для статических переменных и переменных экземпляра.

В стороне Статические методы

  • Статическая переменная может быть доступна с помощью

    1. Если она (статическая переменная) находится в том же классе, значит , либо к ней можно получить доступ variablename или classname.variablename

    2. Если он (статическая переменная) находится в другом классе, значит к нему может получить доступ только classname.variablename

  • Переменная экземпляра доступна по

    1. Если он (переменная экземпляра) находится в том же классе, значит к нему может получить доступ только объект того же класса пример obj.variablename

    2. Если он (переменная экземпляра) находится в другом классе, значит также к нему должен обращаться объект другого класса пример obj.variablename

In side a Методы экземпляра (нестатический метод)

  • Статическая переменная может быть получено с помощью

    1. Если оно (статическая переменная) находится в том же классе, значит либо к нему можно получить доступ с помощью имя переменной или classname.variablename

    2. Если он (статическая переменная) находится в другом классе, значит к нему может получить доступ только classname.variablename

  • Переменная экземпляра может быть доступна по

    1. Если это(Переменная экземпляра) находится в том же классе, означает , к ней может получить доступ только имя переменной .

    2. Если он (переменная экземпляра) находится в другом классе, значит также к нему должен обращаться объект другого класса пример obj.variablename

1 голос
/ 21 июля 2011

Чтобы уточнить мои комментарии:

import static java.math.BigDecimal.TEN;
...

public class Foo {

    private static int COUNT = 0;
    private static BigDecimal FIVE = new BigDecimal(5);
    private BigDecimal height;

    public void bar() {
        height = null; // Good
        this.height = null; // Unnecessary qualification

        COUNT++; // Good
        Foo.COUNT++; // Unnecessary qualification

        height = TEN; // Fine
        height = BigDecimal.TEN; // Fine
        height = Foo.FIVE; // Fine; increases clarity by distinguishing it from similar imported static variables
        height = FIVE; // Fine; perhaps the additional clarification is unnecessary
    }
}
1 голос
/ 20 июля 2011

Помимо точки зрения рецензента (даже вас в будущем :-)), также полезно сохранить префикс имени класса для быстрого рефакторинга, когда это необходимо.Это избавит вас от изменений во всем вашем исходном коде.Учти это тоже!

1 голос
/ 20 июля 2011

Он прекрасно компилируется, потому что - как вы выяснили - статическая переменная final находится в том же классе.Это означает, что переменная находится в «области видимости» кода.И это просто не имеет значения, если вы используете префикс или нет.Только когда вы хотите получить доступ к статическим переменным из другого класса в качестве текущего, вы должны сказать, в каком классе находится переменная.

Это почти то же самое, что сказать this или нет.Например:

private String secret;
public String getSecret()
{
    return this.secret;
}

Или

private String secret;
public String getSecret()
{
    return secret;
}

Это точно так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...