Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > NPE в конструкторе суперкласса


Автор: Temdegon 28.4.2010, 13:27
Есть вот такой вот код:

Код

public class Main {

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

        } catch (Throwable x) {
            System.out.println(x);
        }
    }
}

class A {

    private String string = "Green";

    public A() {
        System.out.println("string: \"" + getString() + "\", length: " + getString().length());
    }

    public String getString() {
        return string;
    }
}

class B extends A {

    private String string = "Red";

    @Override
    public String getString() {
        return string;
    }
}


Почему вызов getString() в кострукотре A() возвращает null?
Объясните пожалуйста, getString() в этом конструкторе вызывается из класса А или из B?

Автор: jk1 28.4.2010, 14:08
getString()  будет вызван из В, сработает полиморфизм. 
Что касается NPE, то вот в чем дело: при вызове new B() сначала неявно вызывается конструктор суперкласса (с предварительной инициализацией поля string класса А), обращающийся к методу getString(). Этот метод возвращает значение переменной из фактического объекта, то есть из В. А она к тому времени еще не инициализирована, так как конструктор суперкласса еще не завершил выполнение.

Автор: Temdegon 28.4.2010, 15:38
Спасибо, все понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)