繁体   English   中英

超类和子类的构造函数

[英]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 ,因此将调用SubtoString()实现。 这是多态性的基础。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM