如果我们使用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();
}
}
公共课SuperTest {
public static void main(String[] args) {
new MySub().info();
}
}
答案 0 :(得分:0)
好吧,让我们找出来吧!
您的测试不会完全回答您的问题。如果要查看是否创建了对象,为什么不在创建一个在调用时打印到控制台的构造函数?
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
个对象。所以你的问题的答案是" no"。
原因是super
和super()
不同。 super
(没有括号)用于访问父类的成员。 super()
(带括号)是对父构造函数的调用,并且仅在构造函数中作为构造函数中的第一个调用有效。因此,使用super
(没有括号)将不创建一个新对象。
此外,super()
实际上并未创建新的独立Parent
对象。它只是在子构造函数继续之前对Parent
字段进行初始化工作。