我在下面有一段代码
public class Super {
public Super (){
System.out.println(this.toString());
}
public String toString(){
return "I am Super";
}
}
public class Sub extends Super {
public Sub() {
System.out.println(toString());
}
public String toString() {
return "I am SubClass";
}
}
public class test {
public static void main (String [] args){
Sub ss = new Sub();
}
}
// RESULT
我是SubClass
我是SubClass
根据理论,它应该先调用超类构造函数然后再调用子类。 但是当我执行它时,它总是打印子类constrctor
答案 0 :(得分:4)
虽然它将首先调用super
类构造函数,但是将调用的toString()
方法是运行时类型的实现(如果有的话)。由于正在创建的对象属于Sub
类型,因此将调用Sub
toString()
的实现。这是多态性的基础。
答案 1 :(得分:1)
this
是subClass的一个实例(它也包含超类)。因此,将调用子类的toString() - System.out.println(this.toString());
答案 2 :(得分:0)
Sub ss = new Sub();
创建的对象实例是Sub,因此将调用toString()子类
即使您使用
Super ss = new Sub();
结果将是相同的
仅在您使用
时Super ss = new Super();
您将获得输出
I am Super
答案 3 :(得分:0)
不是文件中只应该有一个public
类吗?或者我弄错了?
无论如何,即使你做了
Super ss = new Sub();
输出
I am SubClass
I am SubClass
但如果你Super ss = new Super();
,输出将是
I am Super
答案 4 :(得分:0)
你说得对,理论上它应首先打印Super Class Constructor数据,然后打印Sub Class构造函数数据。但是,一旦创建了Subclass对象,就会在为Super Class和Sub Class执行构造函数代码时使用此对象。
Sub ss = new Sub();
将调用Java的Default Super()方法并将子类对象传递给它,此子类对象将调用其 toString()方法,这就是它打印时间'I'的原因是SubClass'。
只需在Super Class构造函数中尝试使用一些字符串参数,就会看到它正在打印。
我是SuperClass 我是SubClass
答案 5 :(得分:0)
In' Super'类构造函数,打印另一个字符串("我是父"),而不是调用this.toString(),它将始终在' Sub'中调用toString()的重叠方法。因为'这个'对应于' Sub'的新对象。在main方法中创建的类。
在这种情况下,您将获得输出
我是父母
我是孩子