когда именно объект создан в Java - PullRequest
0 голосов
/ 17 мая 2018

Учитывая приведенный ниже фрагмент кода:

class SuperClass {
    SuperClass () {
        foo();
    }

    public void foo() {
        System.out.println("In SuperClass foo");
    }
}

public class SubClass extends SuperClass {
    private String str;
    SubClass() {
        str = "SubClass";
    }

    public void foo () {
        System.out.println("In SubClass foo value " + str.toLowerCase());
    }

    public static void main(String[] args) {
        SuperClass ref = new SubClass();
        ref.foo();
    }
}

Этот код генерирует NPE, потому что в конструкторе SuperClass при вызове foo () он фактически вызывает SubClass foo () и генерирует NPE.Я хочу понять, когда именно здесь создается объект SubClass, так как мы все еще в процессе инициализации переменных-членов SubClass в его конструкторе, тогда почему здесь происходит переопределение?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018
it will first call the subclass constructor then subclass to the superclass and then superclass to the object and the execution returns to the superclass then it will start printing.
the first statement will print

В суперклассе foo

В подклассе foo value подкласс

but since the str is not followed up then it will obviously throw the null pointer exception.
0 голосов
/ 17 мая 2018

Когда вы инициализируете Subclass, конструктор Superclass вызывается первым. Суперкласс (более общий) должен быть построен перед подклассом (более конкретным). Имеет смысл, верно?

Теперь в конструкторе суперкласса вызывается foo. Угадай который foo называется? Подкласс foo! Это потому, что вы создаете объект Subclass, поэтому каждый вызываемый вами метод экземпляра будет вызывать реализацию подкласса из-за полиморфизма .

Итак, подкласс foo вызывается и пытается вывести str.toLowerCase(). Обратите внимание, что, поскольку конструктор подкласса еще не был вызван, str не инициализируется, поэтому имеет начальное значение nil, в результате чего NullPointerException.

Если метод подкласса foo был успешно выполнен, конструктор суперкласса вернулся бы, и конструктор подкласса, наконец, был бы вызван.

Урок дня: Не вызывайте нефинальные методы в конструкторе нефинального класса.

0 голосов
/ 17 мая 2018

как ссылка: https://www.geeksforgeeks.org/g-fact-67/

В Java конструктор базового класса без аргументов автоматически вызывается в конструкторе производного класса.


когда ссылка создана, она имеет адрес: SubClass @ c2e1f26. Это подкласс. Так. Когда в конструкции SuperClass () вызывается foo, он ищет foo () в SubClass и выполняет его.

Обновление следить за вопросом
- Мы должны помнить. Конструктор SuperClass () - это вызов первого конструктора SubClass (). Поэтому, когда свойство str не инициализируется.

...