多个 Super( ) 用于重载 super class 构造函数
Multiple Super( ) for overloading super class constructor
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);
}
}
我的问题是我们可以在 subclass 构造函数中使用多个 super ( ) 因为我想初始化两个 super class 参数化构造函数。如果不可能,我该怎么做?
您的代码完全错误。 Java 中的构造函数必须总是调用 exactly 一个超级 class 构造函数。没有在同一个构造函数中写两次 super() 这样的事情。
换句话说:very构造函数中的第一个语句是对超class构造函数的调用。如果您不在那里进行这样的调用,编译器将在幕后插入对 super() 的调用。
从这个意义上说:当你是初学者时,编译器给你一个错误信息;要做的事情:转向一本好书或online resource。
我的争论性答案是你不想那样做(随时挑战我)。你想以这样一种方式设计你的 superclass (Father
),它只需要一个超级构造函数调用来构造和初始化它,以便它可以使用。
在您的示例中,您在 Father
中没有任何字段,因此您的任何构造函数都应该足够好。如果您对现有的构造函数感到满意,但仍希望两者都有输出,则有几个选项。首先,您可以按照 Nghia Do 在评论中的建议添加一个三参数构造函数 Father(int x, int y, int z)
。如果您希望同时拥有这三个构造函数,则无需删除其他两个构造函数。其次,您可以放入一个方法调用而不是第二个超级调用,并在 Father
中编写一个方法来打印消息并执行您需要的其他工作。为了代码重用,您应该让双参数构造函数调用相同的方法而不是重复代码。
想一想如果你有一个带有两个构造函数的 class 并且你需要同时调用这两个构造函数会发生什么——如果允许的话。这将是一个等待发生的棘手错误。总会有人忘记给两者都打电话的风险。你最终会得到一些半构造的对象,当你使用 it.And 时,没有人会知道什么时候会出现问题,当这种情况发生时,它是由于忘记了第二个构造函数调用而引起的,这远非显而易见.正如我所说,你不想要那样。 Java 总是只调用一个超级构造函数的规则是一个很好的规则。
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);
}
}
我的问题是我们可以在 subclass 构造函数中使用多个 super ( ) 因为我想初始化两个 super class 参数化构造函数。如果不可能,我该怎么做?
您的代码完全错误。 Java 中的构造函数必须总是调用 exactly 一个超级 class 构造函数。没有在同一个构造函数中写两次 super() 这样的事情。
换句话说:very构造函数中的第一个语句是对超class构造函数的调用。如果您不在那里进行这样的调用,编译器将在幕后插入对 super() 的调用。
从这个意义上说:当你是初学者时,编译器给你一个错误信息;要做的事情:转向一本好书或online resource。
我的争论性答案是你不想那样做(随时挑战我)。你想以这样一种方式设计你的 superclass (Father
),它只需要一个超级构造函数调用来构造和初始化它,以便它可以使用。
在您的示例中,您在 Father
中没有任何字段,因此您的任何构造函数都应该足够好。如果您对现有的构造函数感到满意,但仍希望两者都有输出,则有几个选项。首先,您可以按照 Nghia Do 在评论中的建议添加一个三参数构造函数 Father(int x, int y, int z)
。如果您希望同时拥有这三个构造函数,则无需删除其他两个构造函数。其次,您可以放入一个方法调用而不是第二个超级调用,并在 Father
中编写一个方法来打印消息并执行您需要的其他工作。为了代码重用,您应该让双参数构造函数调用相同的方法而不是重复代码。
想一想如果你有一个带有两个构造函数的 class 并且你需要同时调用这两个构造函数会发生什么——如果允许的话。这将是一个等待发生的棘手错误。总会有人忘记给两者都打电话的风险。你最终会得到一些半构造的对象,当你使用 it.And 时,没有人会知道什么时候会出现问题,当这种情况发生时,它是由于忘记了第二个构造函数调用而引起的,这远非显而易见.正如我所说,你不想要那样。 Java 总是只调用一个超级构造函数的规则是一个很好的规则。