2

我已经运行了这段代码

public class Redimix extends Concrete{

    Redimix(){
        System.out.println("r ");
    }

    public static void main(String[] args) {
        new Redimix();
    }

}

class Concrete extends Sand{
    Concrete() { System.out.print("c "); }
    private Concrete(String s) { }
}

abstract class Sand{
    Sand(){
        System.out.print("s ");
    }
}

它打印出来了,s c r但我所期待的是,只有r我的问题是对此的逻辑解释是什么?

如果父基类是具有构造函数的抽象类,然后我们创建另一个类,然后将其扩展为基类(在我们的案例中Concrete扩展 Sand),然后我们创建另一个类,然后将其扩展为具体的类名(在我们的case redimix)会调用层次结构中的所有构造函数吗?(从上到下)

4

5 回答 5

6

超类的构造函数总是作为构造函数的第一个动作被调用。

如果您没有显式调用超类的构造函数,则会隐式调用默认构造函数(“无参数”构造函数)。

于 2013-04-13T13:23:33.560 回答
3

那是对的。父对象的构造函数总是在子对象之前调用。这确保了对象处于有效状态,并且扩展了另一个类的对象始终可以知道对象处于什么状态。

这是您在编译器在您的行为中插入隐式构造函数调用后提供的代码。注意 super(); 总是首先被调用。

public class Redimix extends Concrete{

    Redimix(){
        super();
        System.out.println("r ");
    }

    public static void main(String[] args) {
        new Redimix();
    }

}

class Concrete extends Sand{
    Concrete() { super(); System.out.print("c "); }
    private Concrete(String s) { }
}

abstract class Sand{
    Sand(){
        super();  // invoking the constructor for java.lang.Object
        System.out.print("s ");
    }
}
于 2013-04-13T13:26:57.557 回答
0

在每个构造函数中,也会调用父构造函数。

于 2013-04-13T13:24:02.413 回答
0

在每个构造函数中,第一个语句总是super()调用超类构造函数,除了Object

于 2013-04-13T13:24:52.753 回答
0

为此,您需要了解构造函数链接。当您调用任何构造函数时,首先调用所有超类构造函数。在您的构造函数定义中,如果您没有一个编译器,则会向超类构造函数添加一个无参数调用,如下所示:super();

这是因为,层次结构中的所有类都必须在实际类之前构建,因为您的类依赖于它的超类。

此类到超类构造函数应该始终是构造函数定义中的第一条语句,因为它们必须在此相关类之前构建。所以Object 类的构造函数总是最先被执行。

于 2013-04-13T13:25:56.060 回答