多个Super()用于重载超类构造函数

时间:2016-09-10 03:39:00

标签: java constructor overloading super

class Time
{
    public static void main (String args[])
    {
       Son obj = new Son();
    }
}
class Father            // Super Class
{
    Father(int x, int y)            // parameterized constructor 
    {
        int a = x;
        int b = y;
        System.out.println("Super Class Constructor a = "+a);  
        System.out.println("Super Class Constructor b = "+b); 
    }
    Father(int z)            // parameterized constructor 
    {
        int d = z;
        System.out.println("Super Class Constructor d = "+d);  
    }
}
class Son extends Father    // Sub Class
{
    Son()                   // default constructor 
    {
        super(100);
        super(10, 20);      // Problem is here

        int c = 200;
        System.out.println("Sub Class Constructor c = "+c);
    }
}

我的问题是我们可以在子类构造函数中使用多个super(),因为我想初始化两个超类参数化构造函数。如果不可能那么我该怎么做?

2 个答案:

答案 0 :(得分:1)

你的代码完全错了。 Java中的构造函数必须始终调用完全一个超类构造函数。没有在同一个构造函数中写下super()两次的事情。

换句话说:构造函数中的非常第一个语句是对超类构造函数的调用。如果您没有在那里进行这样的调用,编译器将在封面后面插入对 super()的调用。

从这个意义上说:当你是初学者时,编译器会给你一个错误信息;要做的事情:转向一本好书或online resource

答案 1 :(得分:0)

我的论战答案是你不想这样做(随意挑战我)。您希望设计超类(Father),使其只需要一个超级构造函数调用来构造和初始化它,以便它可以使用。

在您的示例中,您在Father(int x, int y, int z)中没有任何字段,因此您的任何构造函数都应该足够好。如果你对你拥有的构造函数感到满意,但仍然想要两者的输出,那么有几个选项。首先,您可以添加一个三参数构造函数Father,如Nghia Do在评论中所建议的那样。如果您想要全部三个,则不需要删除其他两个构造函数。其次,您可以放入方法调用而不是第二个超级调用,并在{{1}}中编写一个方法来打印消息并执行您需要的其他工作。为了代码重用,你应该让双arg构造函数调用相同的方法而不是重复代码。

想想如果你有一个带有两个构造函数的类并且你需要同时调用它们会发生什么 - 如果允许的话。这将是一个等待发生的棘手错误。总会有人忘记给两个人打电话的风险。你最终得到了一些半构造的对象,当你使用它时,没有人会知道什么时候会出错。当发生这种情况时,很明显它是由于被遗忘的第二个构造函数调用。正如我所说,你不希望这样。 Java总是称之为一个超级构造函数的规则是一个很好的规则。