子类是否从它的超类继承构造函数?

时间:2011-03-04 12:02:22

标签: java constructor

在子类中,我们可以使用子类的构造函数初始化数据成员,该构造函数在内部调用超类的构造函数super()。如果子类不能从其超类继承构造函数,那么super()如何调用初始化超类?

6 个答案:

答案 0 :(得分:34)

来自子类的构造函数可以从超类中调用构造函数,但它们不会被继承。

要明确,这意味着如果你有类似的东西:

public class Super
{
    public Super(int x)
    {
    }
}

public class Sub extends Super
{
    public Sub()
    {
        super(5);
    }
}

然后你不能写:

new Sub(10);

因为没有Sub(int)构造函数。

将构造函数视为未初始化的静态方法,并初始化对象的隐式参数可能会有所帮助。

来自Java Language Spec, section 8.8

  

构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖。

答案 1 :(得分:2)

没有子类不能继承其超类的构造函数。

构造函数是类的特殊函数成员,因为它们不是由子类继承的。构造函数用于在创建时为对象提供有效状态。

其中一个主要原因是因为您可能不希望覆盖超类构造函数,如果它们是继承的,那么它们是可能的。通过为开发人员提供覆盖超类构造函数的能力,您将侵蚀该语言的封装能力。

另请参阅:Constructors are never inherited

答案 2 :(得分:2)

super是用于引用超类的Java关键字,而super()是调用超类的构造函数的方法。构造函数不是继承的,但您仍然可以调用它。

答案 3 :(得分:0)

首先,构造函数不是类的成员,只有成员是继承的。

其次,我们可以想象我们不希望子类具有与父类相同的构造函数的情况。

想象一个抽象类Vehicle,带有构造函数Vehicle(int wheels)和子类Bicycle。

根据定义,一辆自行车有2个轮子所以我们可以想象自行车构造器会调用super(2)并且在这种情况下自行车不暴露构造器Bicycle(int wheel)会不会更好?

答案 4 :(得分:0)

No ..根本没有...一个子类不继承它的Superclass构造函数。而且它调用它可以调用它的超类构造函数使用关键字“super()”...

答案 5 :(得分:0)

public class Super
{
    public Super(int x)
    {
    }
}

public class Sub extends Super
{
    public Sub(int x)
    {
        super(x); // call constructor from Super class 
    }
}
Sub obj = new Sub(5);