超类和子类中的构造函数

时间:2014-07-02 05:52:56

标签: java

我在下面有一段代码

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

6 个答案:

答案 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方法中创建的类。

在这种情况下,您将获得输出

我是父母

我是孩子