[英]Constructors in superclass and subclass
我下面有一段代码
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();
}
}
//结果
我是子类
我是子类
按照理论,它应该先调用超类构造函数,然后再调用子类。 但是当我执行它时,它总是打印子类构造器
尽管它将首先调用super
类构造函数,但是将被调用的toString()
方法是运行时类型的实现(如果有的话)。 由于要创建的对象的类型为Sub
,因此将调用Sub
的toString()
实现。 这是多态性的基础。
this
是subClass的实例(也包含超类)。 因此,子类的toString()将被调用System.out.println(this.toString());
Sub ss = new Sub();
创建的对象实例是Sub,因此toString()将被子类调用
即使您使用
Super ss = new Sub();
结果将是相同的
仅当您使用
Super ss = new Super();
您将获得输出为
I am Super
文件中不应该只有一个public
类吗? 还是我弄错了?
无论如何,即使你这样做
Super ss = new Sub();
输出将是
I am SubClass
I am SubClass
但是,如果您执行Super ss = new Super();
,输出将是
I am Super
没错,从理论上讲,它应该先打印“超类构造函数”数据,然后再打印“子类构造函数”数据。 但是一旦创建Subclass对象,该对象将在执行Super Class和Sub Class的构造函数代码时使用。
Sub ss = new Sub();
将调用Java的Default Super()方法并将其传递给子类对象,并且此Sub Class对象将调用其toString()方法,这就是为什么它同时打印两次“我是子类”的原因。
只需尝试在您的Super Class构造函数中使用一些字符串参数,您就会看到它正在打印。
我是超人我是超人
在“超级”类构造函数中,打印另一个字符串(“我是父母”),而不是调用this.toString(),因为它总是调用“ Sub”类中toString()的重写方法,因为“ this”对应于新在main方法中创建的'Sub'类的对象。
在这种情况下,您将获得以下输出:
我是父母
我是孩子
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.