2014-02-08 3 views
1

у меня есть это 2 класса:Наследование вопрос, который я не могу понять

public class A { 
    protected int _x; 

    public A() { 
     _x = 1; 
    } 

    public A(int x) { 
     _x = x; 
    } 

    public void f(int x) { 
     _x += x; 
    } 

    public String toString() { 
     return "" + _x; 
    } 
} 
public class B extends A { 
    public B() { 
     super(3); 
    } 

    public B(int x) { 
     super.f(x); 
     f(x); 
    } 

    public void f(int x) { 
     _x -= x; 
     super.f(x); 
    } 

    public static void main(String[] args) { 
     A[] arr = new A[3]; 
     arr[0] = new B(); 
     arr[1] = new A(); 
     arr[2] = new B(5); 
     for (int i = 0; i < arr.length; i++) { 
      arr[i].f(2); 
      System.out.print(arr[i] + " "); 
     } 
    } 
} 

Выход является 3 3 6, и я удивляюсь, почему третья итерация 6

+1

Используйте отладчик. –

+1

Не могли бы вы сделать целый пример несколько разумным? Я не против читать код, который сам по себе совершенно ошеломляет, однако чтение полуобпущенных имен переменных/классов быстро раздражает. Также добавьте теги @ @ Override. – skiwi

+0

Просто просмотрите код в своем уме ... Когда вы не вызываете супер-конструктор, вызывается пустой супер-конструктор. – Matthias

ответ

6

Конструктор:

public B(int x) 
{ 
    super.f(x); 
    f(x); 
} 

переводчик компилятором на это:

public B(int x) 
{ 
    super(); 
    super.f(x); 
    f(x); 
} 

Думаю, теперь вы поймете, почему это 6.

+0

после первого супер _x = 1, и после этого у меня есть super.f (x), поэтому он переходит к функции f внутри класса A, но поскольку у меня есть функция внутри класса B, она реализует f из класса B, и внутри этого fi есть еще один time super.f (x), поэтому он выглядит как рекурсия – user3271698

+0

@ user3271698 'super.f (x)' не будет вызывать переопределенный метод. –

+0

Почему бы и нет? его объект B – user3271698

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