这是来自OCJP测试考试的问题(和答案)。我对此非常困惑。
这是一个问题评论(在Kaplan SelfTest网站上):
审核已回复 第64条,共90页:1Z0-803.6.5.6
关于构造函数重载的说法是什么?
解释
默认构造函数可以在子类中重载。如果没有为类定义构造函数,则编译器将自动提供默认构造函数。因为子类可以定义自己的构造函数而不影响超类,所以可以定义一个带参数的构造函数,它可以隐式或显式地调用超类构造函数。
默认构造函数不能在同一个类中重载。这是因为一旦在类中定义了构造函数,编译器就不会创建默认构造函数。因此,尝试重载默认构造函数将有效地将其从类中删除。
构造函数不能使用其他名称。在同一个类中,重载的构造函数使用相同的名称。因为子类的名称与它们的超类不同,所以重载的构造函数将具有不同的名称。
构造函数不需要使用this关键字。 this关键字允许构造函数引用其他构造函数方法和/或实例上下文。在重载的构造函数中不需要使用this关键字。
目标:
使用方法和封装
子目标:
创建并重载构造函数
答案 0 :(得分:5)
你的术语错了。
仅对具有相同名称但在特定类中具有不同参数的方法进行重载 。
对子类进行覆盖,其中的方法与“超类”中的方法具有相同的“签名”(相同的名称和参数)。
请注意,构造函数不是“重写”(根据定义,它们具有与超类中的方法不同的签名)。
相反,编译器使构造函数隐式调用其超类的默认构造函数(如果存在),除非使用super
关键字显式调用超类的特定构造函数。 / p>
类似地,您不能“重载”子类中超类的构造函数(重载不能继承),但您可以“重载”特定类中的另一个构造函数。
以下是对超类构造函数和重载构造函数的隐式和显式调用的示例:
public class X {
// no default constructor defined so
// compiler adds implicit default constructor here: public X(){}
}
public class Y extends X {
// explicitly declared default-constructor for class Y
public Y() {
// compiler automatically calls implicit X default constructor here
System.out.println("constructing a Y instance");
}
// explicitly declared constructor which overloads the default constructor for Y
public Y(String s) {
// compiler automatically calls implicit X default constructor here
System.out.println("constructing a Y instance with param " + s);
}
}
public class Z extends Y {
// explicitly declared default constructor for Z
public Z() {
super("Z"); // explicitly call the non-default constructor in Y here
System.out.println("constructing a Z instance");
}
}
因此构造一个Z最终调用X(),然后调用Y(“Z”)并导致此输出:
Z z = new Z();
// outputs: constructing a Y instance with param Z
// constructing a Z instance
来自文档:(http://docs.oracle.com/javase/tutorial/java/IandI/super.html)
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。
希望有助于为您澄清事情。如果有疑问,请阅读文档,编写一些代码,并使用System.out.println()查看发生了什么。
答案 1 :(得分:0)
构造函数在技术上不是成员函数,因此它们不是真正继承的,因此不能“重载”。但是,仍然可以使用 super 关键字从子类调用它们。
//the class being inherited
public class superclass
{
//the constructor
public superclass(some_parameter)
{
//do stuff
}
}
public class subclass extends superclass
{
public subclass(some_parameter)
{
//the super keyword here is used to access the inherited class
super(some_parameter); //this calls the constructor of the inherited class;
}
}
答案 2 :(得分:0)
首先,overload
与override
不同。例如:
class Foo {
void overloadedMethod() {}
void overloadedMethod(int i) {}
void overridenMethod() {}
}
class Bar extends Foo {
@Override
void overridenMethod() {}
}
构造函数可以像普通方法一样重载,但不能覆盖。
有关详细信息,请参阅此处:link