Каковы правила для получения доступа к статическим элементам? - PullRequest
0 голосов
/ 21 декабря 2011

Я дурачился со статическими членами, я был озадачен, когда что-то скомпилировалось, что я не думаю, что должно:

class ClassA {
    static String s = " ";
}

public class ClassB extends ClassA {
    private ClassB() { 
         s = "I feel like this shouldn't be possible."; 
    }
    public static void main (String[] args) {
        new ClassB();
        System.out.println(s);
    }
}

Я не понимаю, как ClassB может получить доступ к статическому члену в ClassA.Насколько я понимаю, статическая информация хранится в классе, в котором она объявлена, и не передается в подклассы.Это неверное предположение, или компилятор делает что-то подлое?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

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

Если вы сделаете это private, вы не сможете получить к нему доступ.

3 голосов
/ 21 декабря 2011

Статическая информация абсолютно не хранится в классе, в котором она объявлена.Стандартные правила контроля доступа применяются к каждому статическому члену, определенному для класса.Это означает, что вы можете применить модификаторы контроля доступа private, protected, package protected (ваш случай) и public ко всем статическим членам класса (включая методы).

Посмотрите, что такое JLSдолжен сказать о контроле доступа: http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285

0 голосов
/ 21 декабря 2011

В классе B вы фактически устанавливаете s в ClassA, а не в его экземпляре.Строка в вашем конструкторе эквивалентна

private ClassB() { 
         ClassA.s = "I feel like this shouldn't be possible."; 
    }

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

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