Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于重载超类构造函数的多个Super()_Java_Constructor_Overloading_Super - Fatal编程技术网

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

Java 用于重载超类构造函数的多个Super(),java,constructor,overloading,super,Java,Constructor,Overloading,Super,我的问题是,我们可以在子类构造函数中使用多个super(),因为我想初始化两个超类参数化构造函数。如果不可能,我该怎么做呢?您的代码完全错误。Java中的构造函数必须始终准确地调用一个超类构造函数。不存在在同一个构造函数中写两次super()的情况 换句话说:构造函数中的very第一个语句是对超类构造函数的调用。如果不在那里放置这样的调用,编译器将在封面后面插入对super()的调用 从这个意义上说:当你是一个初学者,编译器会给你一个错误信息;要做的事情:找一本好书或一本书 我有争议的回答是你不

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

您的代码完全错误。Java中的构造函数必须始终准确地调用一个超类构造函数。不存在在同一个构造函数中写两次super()的情况

换句话说:构造函数中的very第一个语句是对超类构造函数的调用。如果不在那里放置这样的调用,编译器将在封面后面插入对super()的调用


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

我有争议的回答是你不想那样做(尽管挑战我)。您希望设计超类(
父类
),使它只需要一个超级构造函数调用就可以构造和初始化它,这样它就可以使用了

在您的示例中,
Father
中没有任何字段,因此您的任何构造函数都应该足够好。如果您对现有的构造函数感到满意,但仍然希望从这两个构造函数中获得输出,那么有两个选项。首先,您可以添加一个三参数构造函数
父(intx,inty,intz)
,正如Nghia在评论中建议的那样。如果希望同时使用这三个构造函数,则不需要删除其他两个构造函数。第二,您可以输入一个方法调用,而不是第二个超级调用,然后在
Father
中编写一个方法来打印消息并执行您需要的其他工作。为了代码重用,您应该让两个参数构造函数调用相同的方法,而不是让代码重复


想一想,如果您有一个包含两个构造函数的类,并且需要同时调用这两个构造函数——如果允许的话,会发生什么。这将是一个棘手的错误等待发生。总有一种风险,那就是有人忘了同时打电话给他们。你最终会得到一个半构造的对象,当你使用它时,没有人会知道什么时候会出问题。当这种情况发生时,很难确定这是因为忘记了第二个构造函数调用。就像我说的,你不想那样。Java总是只调用一个超级构造函数的规则是一个很好的规则。

简短的回答是否定的。在你的最后一句话中,你问“我怎样才能做到这一点”,你真正想做的是什么?你的
Father
构造函数非常奇怪,因为它们设置了局部变量,但不使用它们。只构建一个构造函数Father(intx,inty,intz){}@DavidWallace我只是想在一个构造函数中使用两个super()。这在Java中是不允许的,我们不能在一个构造函数中使用两个super(),因为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);
    }
}