Доступ к статической переменной через ссылку на объект в Java - PullRequest
8 голосов
/ 19 марта 2012

Почему мы можем получить доступ к статической переменной через ссылку на объект в Java, как в коде ниже?

public class Static {
    private static String x = "Static variable";

    public String getX() {
        return this.x;                 // Case #1
    }

    public static void main(String[] args) {
        Static member = new Static();
        System.out.println(member.x);  // Case #2
    }   
}

Ответы [ 6 ]

10 голосов
/ 19 марта 2012

Как правило, общедоступные переменные могут быть доступны всем, а закрытые переменные доступны только из текущего экземпляра класса.В вашем примере вы можете получить доступ к переменной x из метода main, потому что этот метод находится в классе Static.

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

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

3 голосов
/ 19 марта 2012

Не рекомендуется ссылаться на статическую переменную таким образом.

Однако ваш вопрос был, почему это разрешено? Я предполагаю, что ответ заключается в том, что разработчик может изменить элемент экземпляра (поле или переменную) на статический член без необходимости изменять все ссылки на этот член.

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

2 голосов
/ 28 февраля 2019

Причина, по которой это разрешено, заключается в том, что JLS говорит, что это так.Конкретные разделы, которые это позволяют, это JLS 6.5.6.2 (для member.x случаев) и JLS 15.11.1 (в обоих случаях).Последний говорит:

Если поле является статическим:

  • Если поле является непустым конечным полем, то результатом является значениеуказанная переменная класса в классе или интерфейсе, которая является типом первичного выражения.

  • Если поле не является окончательным или является пустым конечным, и доступ к полю происходит в переменной классаинициализатор (§8.3.2) или статический инициализатор (§8.7), тогда результатом является переменная, а именно указанная переменная класса в классе, который является типом первичного выражения.


Почему это разрешено JLS?

Честно говоря, я не знаю.Я не могу придумать каких-либо веских причин для их разрешения.

В любом случае, использование ссылки или this для доступа к статической переменной - плохая идея, потому что большинство программистов , вероятно,вводить в заблуждение, полагая, что вы используете поле экземпляра.Это серьезная причина не использовать эту функцию Java.

В первом и втором случаях вы должны ссылаться на переменную как x или Static.x, а не member.x.(Я предпочитаю Static.x.)

1 голос
/ 19 марта 2012

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

Поскольку член является объектом класса Static, вы можете получить доступ ко всем static как к wll, так и к non static.переменные статического класса через объект-член.

0 голосов
/ 12 мая 2019

Это логично имеет смысл, хотя это не интересная практика. Статическая переменная обычно предназначена для принудительного применения единственного объявления переменной во время создания экземпляра. Объект - это новая копия класса с другим именем. Несмотря на то, что объект является новой копией класса, он все еще обладает характеристиками (необоснованного) класса (первого невидимого экземпляра). Поэтому новый объект также имеет статические члены, указывающие на оригинальную копию. Следует отметить следующее: новым экземпляром StackOverflow также является StackOverflow.

0 голосов
/ 29 марта 2016

Нестатический член является членом экземпляра. Статический член (широкий класс) не может получить доступ к членам экземпляра, поскольку нет способа определить, какому экземпляру принадлежат какие-либо конкретные нестатические члены.

Объект экземпляра всегда может ссылаться на статические члены, поскольку он принадлежит классу, который глобален (совместно используется) с его экземплярами.

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