2011-12-21 2 views
0

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

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. Мое понимание заключалось в том, что статическая информация хранится с объявленным классом и не передается в подклассы. Это неправильное предположение, или компилятор делает что-то подлый?

ответ

4

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

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

+1

Полезная ссылка http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html. У этого есть симпатичная маленькая таблица, показывающая отношения. –

0

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

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

Однако вы можете опустить «CLASSA», потому что доступ к нему из производного класса.

3

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

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

Смежные вопросы