public class Parent {
Parent() {
test();
}
public static void main(String[] args) {
new Child();
}
protected void test() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent {
private final String someString;
Child() {
someString = "some Text";
}
protected void test() {
System.out.println("Hello from Child");
System.out.println(someString);
}
}
Ответ
Hello from Child
null
Если в конструкторе базового класса вызвать метод, который переопределен в дочернем, то при создании дочернего класса в конструкторе базового будет вызван метод дочернего класса, хотя очередь инициализации этого класса еще не настала. Это может привести к ошибкам. Например, вызванный метод может использовать переменные, которые еще не были инициализированы. Надо стараться избегать вызова методов в конструкторах. Можно смело вызывать только методы, помеченные в текущем классе как final или private, т.к. они не переопределяются.
null
Если в конструкторе базового класса вызвать метод, который переопределен в дочернем, то при создании дочернего класса в конструкторе базового будет вызван метод дочернего класса, хотя очередь инициализации этого класса еще не настала. Это может привести к ошибкам. Например, вызванный метод может использовать переменные, которые еще не были инициализированы. Надо стараться избегать вызова методов в конструкторах. Можно смело вызывать только методы, помеченные в текущем классе как final или private, т.к. они не переопределяются.
Комментариев нет:
Отправить комментарий