#java #constructor
#java #конструктор
Вопрос:
public class NewSeqTest {
public static void main(String[] args) {
new S();
new Derived(100);
}
}
class P {
String s = "parent";
public P() {
test();
}
public void test() { //test 1
System.out.println(s " parent");
}
}
class S extends P {
String s = "son";
public S() {
test();
}
@Override
public void test() { //test 2
System.out.println(s " son");
}
}
abstract class Base {
public Base() {
print();
}
abstract public void print();
}
class Derived extends Base {
private int x = 3;
public Derived(int x) {
this.x = x;
}
@Override
public void print() {
System.out.println(x);
}
}
// вывод
null son
son son
0
мой вопрос
1. почему конструктор P печатает «нулевой сын»; Я думаю, что это «нулевой родитель»?
2 почему абстрактный класс Base может выполнять абстрактный метод print() в конструкторе?
извините за формат кода, я не знаю, как его правильно использовать.
Ответ №1:
-
Вы переопределили метод
test
в своем подклассеS
и создаете объект типаS
. Итак, в конструкторе суперкласса приtest()
вызове он вызывает переопределенную версиюtest()
из подклассаS
. В этом смысл переопределения. -
То же, что и 1. Метод
print
не является абстрактным в классеDerived
, и вы создаете экземплярDerived
, а не ofBase
. (Незаконно говоритьnew Base()
по причине, которую вы упомянули: вы не можете вызвать абстрактный метод)
Ответ №2:
- Выполнение
new S();
вызываетP
запуск конструктораtest()
. Он выполняет переопределенныйtest()
, вS
котором печатаетсяs
. Он используетs
inS
, который не был инициализирован, потому что конструкторS
выполняется после конструктораP
.
2. Тот же ответ, что и для 1. Переопределенныйprint()
выполняется, ноx
еще не инициализирован.
кстати: попробуйте использовать отладчик и запустить программу шаг за шагом, чтобы следовать пути выполнения.