#java #super
#java #super
Вопрос:
Будет ли создан родительский объект, если мы используем ключевое слово super для вызова метода родительского класса в дочернем объекте?
Результаты показывают, что и Mybase, и MySub имеют один и тот же ссылочный адрес. Не уверен, что это хорошая демо-версия.
класс Mybase {
public void address() {
System.out.println("super:" this);
System.out.println( this.getClass().getName());
}
}
класс MySub расширяет Mybase {
public void address() {
System.out.println("this:" this);
System.out.println( this.getClass().getName());
}
public void info() {
System.out.println("this:" this);
super.address();
}
}
супертест публичного класса {
public static void main(String[] args) {
new MySub().info();
}
}
Комментарии:
1. Почему бы вам не попробовать и не выяснить?
2. он создает экземпляр дочернего класса, но ему необходимо инициализировать члены родительского класса
3. Добро пожаловать в SO. Подобные вопросы очень расплывчаты и, вероятно, вызовут отрицательные голоса. Попробуйте создать небольшой фрагмент кода, иллюстрирующий вашу проблему!
Ответ №1:
Что ж, давайте выясним!
Ваш тест не совсем отвечает на ваш вопрос. Если вы хотите узнать, создан ли объект, почему бы не создать конструктор, который выводится на консоль при вызове?
public class Test {
static class Parent {
Parent() {
System.out.println("Parent constructor called");
}
void method() {
System.out.println("Parent method called");
}
}
static class Child extends Parent {
Child() {
System.out.println("Child constructor called");
}
@Override
void method() {
System.out.println("Child method called");
super.method();
}
}
public static void main(final String[] args) {
new Child().method();
}
}
Если вы запустите это, вы получите этот вывод:
Parent constructor called
Child constructor called
Child method called
Parent method called
Итак, как вы можете видеть, когда method()
был вызван, ни Parent
один объект не был создан при super
использовании ключевого слова. Итак, ответ на ваш вопрос «нет».
Причина в том, что super
и super()
разные. super
(без круглых скобок) используется для доступа к членам родительского класса. super()
(в круглых скобках) — это вызов родительского конструктора, и он действителен только внутри конструктора в качестве первого вызова в конструкторе. Таким образом, использование super
(без круглых скобок) не создаст новый объект.
Кроме того, super()
фактически не создается новый независимый Parent
объект. Он просто выполняет инициализацию для полей Parent
, которые необходимы до продолжения работы дочернего конструктора.