2015-12-19 3 views
0
class B { 
    int xB = 10; 
} 

class C extends B { 
    int xB = 4; 

    C() { 
     System.out.println(super.xB); 
     System.out.println(B.xB); 
    } 
} 

У меня есть ошибка для B.xB. Он говорит, что xB не является статическим, поэтому вы не можете его использовать. Но оно не дает мне ошибку для super.xB. Зачем?Почему супер доступ к сверх статической переменной суперкласса?

ответ

2

Когда вы определяете xB в подклассе, он в основном скрывает переменную xB суперкласса. Поэтому, если вы печатаете this.xB, вы получите 4. Использование super - это способ доступа к скрытой переменной суперкласса и не имеет ничего общего со статическими переменными. Также, как вы правильно догадались, с xB есть переменная экземпляра (не статическая) в суперклассе, вы не можете получить к ней доступ только с именем класса.

Вы можете попробовать

class C extends B { 
    int xB = 4; 

    C() { 
     System.out.println(this.xB); 
     System.out.println(super.xB); 
     System.out.println(((B)this).xB); //same behavior as super.xB 
     //System.out.println(B.xB); // Not allowed as xB is not static in B 
    } 
} 

вы получите

4 
10 
10 
1

Поскольку вы обращаетесь к переменной XB из класса B с помощью идентификатора класса, а не с помощью этого или супер. Либо super в порядке, либо вы можете сделать ((B)this).xB.

1

super используется для доступа к переменным и функциям суперкласса. super используется для вызова конструктора суперкласса.

Статические переменные - это переменные, значения которых являются общими для всех объектов класса. Это как один экземпляр для всех объектов. Пример:

int a; //variable of someclass 
static int b; //variable of someclass 
someclass ob=new someclass(); 
someclass ab=new someclass(); 

ab и ob будут иметь разные копии переменной a, так как a не является статическим. Но они поделятся одной копией b.

поэтому, a доступен с использованием имени объекта (так как каждый объект obbject имеет уникальную копию).

ob.a=1; 
ob.b=2; 

И доступно b с использованием имени класса. someclass.b=4 (значение остается 4 для всего объекта).

Таким образом, статическая переменная означает только одну копию и, следовательно, она разделяется всеми объектами и не уникальна для объекта, и именно по этой причине ее нельзя получить с помощью имени объекта.

Это то же самое с переменной xb. Это не статическая переменная, поэтому каждый объект имеет копию. Получите доступ к ней, используя имя объекта.