Как родительские и дочерние поля инициализируются в Inheritance? - PullRequest
0 голосов
/ 18 февраля 2019

Я сталкиваюсь с одной путаницей.

Вот мой небольшой фрагмент кода

public class Father {

    public String x;

    public Father() {
        this.init();
        System.out.println(this);
        System.out.println(this.x);
    }

    protected void init() {
        x = "Father";
    }

    @Override
    public String toString() {
        return "I'm Father";
    }

    void ParentclassMethod(){

        System.out.println("Parent Class");
    }

}


public class Son extends Father {
    public String x;


    @Override
    protected void init() {
        System.out.println("Init Called");

        x = "Son";
    }

    @Override
    public String toString() {
        return "I'm Son";
    }

    @Override
    void ParentclassMethod(){
        super.ParentclassMethod();
        System.out.println("Child Class");
    }

}

public class MainCLass{

    public static void main(String[] args){

        Son ob = new Son();

}

Поэтому, когда я создаю экземпляр класса Son, который наследуется от Class Father, JVM автоматическивызывает конструктор класса отца.Он создает экземпляр типа Son, когда конструктор отца вызывает иначе, поля отца не инициализируются.Пока хорошо ...!

Как видите, поле x получено из класса Отца в класс Сына.И мой код инициализирует x, используя init() метод.

Тогда почему он показывает ноль.

Это очень запутанно.Кто-нибудь может объяснить?

1 Ответ

0 голосов
/ 18 февраля 2019

Переменные не являются полиморфными в Java.Поскольку вы повторно объявили x внутри Son, эта переменная на самом деле будет другой x, чем переменная в Father.Таким образом, в init методе Son вы инициализируете Son x, но не Father x.

С другой стороны, ваше утверждение System.out.println(this.x); находится внутри класса Father, поэтому оно знает только о Father * x.Поскольку вы больше не инициализируете эту переменную из-за переопределения метода init, x в Father остается null (по умолчанию) и, следовательно, будет печатать null.

Вы можете исправитьпроблема, удалив public String x; из класса Son.Это сделает Father x единственным x, устраняя проблему.

Однако, как правило, вы хотите сделать эту переменную private вместо public.Вы также никогда не должны вызывать не-1037 * метод в конструкторе. Может вносить только ошибки .В этом случае правильным способом инициализации будет иметь конструктор с параметром в Father:

public class Father {
    private String x;

    protected Father(String x) {
        this.x = x;
        System.out.println(this);
        System.out.println(this.x);
    }

    public Father() {
        this("Father");
    }

    // Rest of father's code, without the init method
}

public class Son extends Father {
    public Son() {
        super("Son");
    }

    // Rest of son's code, without the init method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...