2016-08-15 4 views
-4

Почему super не влияет на i Поле в классе C? Выходной сигнал 012, но почему бы и нет 321, так как класс B расширяет класс C?java super for field

public class C { 
     protected int i; 

     public C(int i){ 
      this(i,i); 
      System.out.print(this.i); 
      this.i=i; 
     } 

     public C(int i, int j) { 
      System.out.print(this.i); 
      this.i=i+j; 
     } 

     public C(){ 
       this(1); 
       System.out.print(i); 
     } 

     public static void main(String[] args) { 
      C c=new C(); 
     } 
} 

public class B extends C{ 
     public B(){ 
       super.i=3; 
     } 



     public static void main(String[] args){ 
      C c=new B(); 
     } 
} 
+2

это действительно nesseccary опубликовать свой вопрос несколько раз только с разными названиями? –

+0

тот же вопрос сегодня –

+0

@ Андреас: Ну, это не тот же вопрос, это продолжение. – Thilo

ответ

1

super может использоваться для доступа к переопределенным методам. В вашем сценарии i является наследуемым членом B.

Если вы переопределите метод в B, который был определен на C, вы можете вызвать его из B с помощью ключевого слова super.

+1

считают, что используется слово «используется» для «может использоваться» или «используется». – Bathsheba

2

super.i просто относится к this.i (или просто i), потому что класс B не декларирует свою собственную версию i, поэтому он наследует поле от C уже.

public B(){ 
      super.i=3; // the super here does not do anything 
    } 

Первое, что должен сделать конструктор, - это вызвать один из суперконструкторов. Так что это эквивалентно:

public B(){ 
      super(); 
      i=3; 
    } 

Как вы можете видеть, код в суперкласса C выполняется перед i устанавливается на 3. Именно поэтому она печатает старое значение.

0

Это довольно просто. That's Происходящее:

B Constructor is called. 

B doesn´t have an explicit super constructor call- so implicity call super(). 

C() Constructor is called -> call C(int) 

C(int) Constructor is called -> call C(int,int); 

C(int, int) is called. print i. i only has the default value yet so print ->0 

C(int, int) does increment i by j, which at this point is 1+1 = 2 

C(int) Constructor callback, as C(int, int) is done, print i = 2 

C(int) sets i = 1 and prints i = 1. 

B() callback as C() is done. set instance variable i to 3. 

Как вы можете видеть, у вас есть другой выход, как 021 и that's все, что случится.

Я не знаю, каково было ваше первоначальное намерение, но super может иметь разные значения.

В конструкторе вы обычно получаете доступ к конструктору родителей с super.

, выполнив super.i, вы получаете доступ только к переменной экземпляра i родительского класса.

можно, выполнив super.testMethod() вызов метода testMethod из ParentClass