2015-01-22 2 views
2

У меня возникает вопрос, почему этот фрагмент кода при его исполнении выводит значение 0. Я не совсем понимаю, что происходит в конструкторе SubClass, и почему это происходит, когда я стереть переопределенный метод implicitValue, он выводит 10. Создает ли конструктор SubClass конструктор SuperClass? Спасибо.Наследованный член-конструктор Java-подкласса

class SuperClass { 
    protected int superClassValue; 

    public SuperClass() { 
     superClassValue = implicitValue(); 
    } 

    public int implicitValue() { 
     return 10; 
    } 

    public int getValue() { 
     return superClassValue; 
    } 
} 

class SubClass extends SuperClass { 
    private int subClassValue; 

    public SubClass() { 
     subClassValue = 20; 

    } 

    public int implicitValue() { 
     return subClassValue; 

    } 
} 

class Example { 
    public static void main(String argv[]) { 
     SubClass ss = new SubClass(); 
     System.out.println("The value is " + ss.getValue()); 

    } 
} 

ответ

3

TL; DR

Проблема заключается в том, что implicitValue от SubClass используется суперкласс неявного конструктора суперкласса (super()) с помощью implicitValue() метода перед subClassValue = 20; будет выполнен в подклассе конструктор, поэтому он возвращает значение subClassValue по умолчанию, который для int поле 0.


делают ли конструктор SubClass использовать конструктор суперкласса?

Да, конструктор подкласса при запуске всегда вызывает конструктор суперкласса, поэтому код

public SubClass() { 
    subClassValue = 20; 
} 

такой же, как

public SubClass() { 
    super();//superclass constructor 
    subClassValue = 20; 
} 

Но давайте посмотрим на код. Вы печатаете результат getVlaue() метода, который существует в вашем суперкласса

public int getValue() { 
    return superClassValue; 
} 

Как вы видите, она возвращает значение superClassValue. Перед тем, как вызвать getVlaue() вы создаете ss экземпляр, так что вы вызываете код

super();//superclass constructor 
subClassValue = 20; 

, который означает, что вы вызываете конструктор суперкласса, который выглядит как

public SuperClass() { 
    superClassValue = implicitValue(); 
} 

так this.superClassValue инициализируются возвращаемым значением implicitValue() метода , но из-за dynamic binding (поздняя привязка) JVM попытается найти реализацию этого метода, начиная с фактического класса this, который равен SubClass, а так как этот класс имеет свой собственный избыточный ден версия будет вызываться

public int implicitValue() { 
    return subClassValue; 
} 

но subClassValue не был установлен ни к чему еще

super();// <-- we are still here 
subClassValue = 20;// this line was not executed yet 

так subClassValue все еще имеет значение по умолчанию 0, что означает, что

superClassValue = implicitValue(); //will be initialized with 0; 

так

public int getValue() { 
    return superClassValue; 
} 

вернет 0.

-1

Похоже, что что-то не так с вашим методом переопределения или подкласса. Поскольку это похоже на то, когда оно реализует переменную, значение не получает экземпляр, поэтому оно по умолчанию равно 0, а затем, когда вы удаляете его, класс super берет на себя, в результате вы получаете значение 10.

1

Да, конструктор подкласса неявно вызывает конструктор суперкласса, если такой вызов явно не задан. Но он печатает 0 из-за того, что метод implicitValue переопределяется в SubClass.

  1. Вызывается конструктор суперкласса. Здесь создается часть объекта SuperClass. Все переменные инициализируются. Поскольку нет явного значения, данный компилятор дает superClassValue значение по умолчанию, 0. Затем конструктор суперкласса вызывает implicitValue(), который вызывает метод подкласса. Этот метод возвращает superClassValue, который был инициализирован 0. Это значение явно привязано к superClassValue.
  2. Подкласс инициализирует свой subClassValue до 10.
  3. Метод getValue() называется, и он возвращает superClassValue, то есть 0. The value is 0 печатается.

Если вы должны были удалить метод implicitValue в SubClass, то он унаследует версию SuperClass «s метода, который возвращает 10.

Если вы должны были изменить метод implicitValue в SubClass вернуть 5, то было бы инициализировать superClassValue к 5, и он будет печатать The value is 5.

1
  1. В вашем случае: конструктор SuperClass будет вызываться по умолчанию.

  2. Когда процесс Java: новый SubClass(). Сначала он вызовет конструктор SuperClass. Когда вызывается конструктор SuperClass - Возвращение значения из implicitValue() будет присвоено superClassValue - Вызывается метод implicitValue() - метод SubClass (NOT implicitValue() SupperClass, который вы вызываете, как вы думали, - функция полиморфизма ООП) , Когда вызывается implicitValue() для SubClass, subClassValue еще не инициализируется (subClassValue = 20; еще не запущено), поэтому subClassValue все равно будет ZERO. Именно по этой причине вы видите Zero в выходе.

  3. При удалении переопределить implicitValue в SubClass. Вызывается implicitValue() - implicitValue из SupperClass -> Вот почему вы видите 10 в выводе.