Унаследовать, почему результат распечатки является нулевым? - PullRequest
0 голосов
/ 10 декабря 2018

Вот коды , Я думал, что результатом будет «B», потому что метод «a ()» перезаписан, но результат «нулевой», чего я не совсем понимаю, почему.Может кто-нибудь объяснить, пожалуйста?большое спасибо

public class HelloWorld {

    public static void main(String[] args) {
        B b = new B();
    }
}

class A{
    private String name = "A"; // "public" will have the same outcome

    public A()
    {
        a();
    }

    public void a(){
        System.out.println(name);
    }

}

class B extends A{  
    private String name = "B";

    public void a()
    {
        System.out.println(name);
    }

}

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Этот код работает нормально, просто запомните одно ЗОЛОТОЕ ПРАВИЛО: НЕ ВЫЗЫВАЙТЕ ПЕРЕЗАГРУЗЕННЫЙ МЕТОД ОТ КОНСТРУКТОРА!

Когда инициализация A вызывает, A.a(), где a() переопределяетсяв дочернем классе B, но этот класс еще не инициализирован, поэтому все параметры имеют свои значения по умолчанию.

Гораздо лучше разделить его двумя вызовами;

B b = new B();  // init all classes completely to avoid unobvious states
b.a();          // do what you want

PS

Ваш код работает нормально, но это хорошее или собеседование.В реальной жизни гораздо лучше избегать таких ситуаций.

0 голосов
/ 10 декабря 2018

Я не уверен, но я предполагаю, что причина здесь в том, когда инициализируется переменная экземпляра.

Конструктор подкласса неявно вызывает конструктор суперкласса.Я переписываю конструктор класса B следующим образом:

public void B()
    {
       super();
       System.out.println(name);
    }

Выполнение оператора super(), поток кода переходит к конструктору класса A. Выполнение оператора a() в конструкторе класса Aперейдет к методу a() класса B из-за полиморфизма.В настоящее время переменная name класса B еще не инициализирована, поэтому она выводит ноль (значение по умолчанию для переменной String).

После завершения оператора super() теперь инициализируется переменная name.Насколько я знаю, переменной экземпляра будет присвоено значение после вызова super().Затем в следующем операторе println он напечатает строку, которую мы присвоили name.Ваш исходный код не имеет оператора println, поэтому он печатает только null.

0 голосов
/ 10 декабря 2018

Вы не вызывали переопределенный метод здесь.Вот почему он не печатает «B».Вы получите 'null' в качестве ответа, потому что оба объекта имени были скрыты в то время, потому что вы создали объект с одинаковым идентификатором для обоих классов.

0 голосов
/ 10 декабря 2018

Поскольку вы не вызывали метод a () в своей главной функции.

Просто добавьте ba () после инициализации класса B. И вы получите свой результат.

Спасибо Happyкодирование;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...