默认构造函数的差异& java中的非参数构造函数?

时间:2014-08-20 11:49:11

标签: java inheritance constructor

我在制作一些程序时在java中发现了一件有趣的事情。这是一个简单的代码。 当我创建此代码时,类Son发生了错误。这意味着第二个构造函数需要一个像这样的非参数构造函数.public classname(){}。

但是,所有类都有自己的默认构造函数,所以我不认为没有必要创建非参数构造函数。它们之间有区别吗?

class Papa 
{
    private int papa_var;

    public Papa(String name, int age)
    {
    }
}

class Son extends Papa
{
    private int son_var;

    public Son(String name, int age)
    {
        super(name,age);
    }
    public Son(int car, int robot)
    {
    }
}

5 个答案:

答案 0 :(得分:5)

但是,所有类都有自己的默认构造函数,所以我不认为没有必要创建非参数构造函数。它们之间是否存在差异? - 仅当您没有定义其他构造函数时,Java才会提供默认非参数化构造函数

答案 1 :(得分:2)

只有在没有明确提供默认构造函数的情况下,Java才会隐式提供默认构造函数。子类的构造函数的职责是调用超类的构造函数。因此,您必须使用super关键字在子类构造函数中显式添加语句以调用超类构造函数。这是Son的第二个构造函数中的错误。

如果在类中没有提供构造函数,则Son的隐式默认构造函数也会在初始化类Son的对象时调用类Papa的构造函数。

答案 2 :(得分:1)

如果您的类没有定义另一个构造函数,则仅隐式创建默认构造函数(public MyClass() {})。 如果是,则必须明确定义no-args构造函数。

答案 3 :(得分:0)

您收到错误的原因是,在没有默认构造函数(没有参数)的情况下,您被迫在以下行中调用超级构造函数:

public Son(int car, int robot)
{
    super("papa_name", 99);
}

如果您声明构造函数(无论其形式和签名是什么),您的默认(非参数)构造函数 由编译器创建,因此我上面写的super调用无法推断(编译器可能不知道你要调用哪个超级构造函数,即使你只写了一个 - 你可能会添加许多后来)。因此,编译器可以安全地播放它并且您会收到错误。

如果已经编写了一个没有参数的构造函数或默认情况下有一个构造函数(即自己没有编写构造函数),那么编译器就会推断出一个超级调用,如

public Son(int car, int robot)
{
    super();
}

即使你自己也不必自己写。

答案 4 :(得分:0)

在Java中,默认构造函数是一个没有参数的构造函数(即非参数),因为如果你没有任何构造函数,它默认是创建的在幕后。调用超类的构造函数也是如此,即如果没有对超级构造函数(或“this”--constructor)的显式调用,Java将默认情况下插入对无参数超级构造函数的调用< / em>(即隐含地添加super();)。

在您的情况下,有明确的构造函数,因此Java不会自动创建默认构造函数,因为Papa没有super();Son(int car, int robot)中的隐式{{1}}将不会成功 - 因此错误。