默认构造函数可以在子类中重载?

时间:2014-06-21 22:13:06

标签: java

这是来自OCJP测试考试的问题(和答案)。我对此非常困惑。

这是一个问题评论(在Kaplan SelfTest网站上):

审核已回复 第64条,共90页:1Z0-803.6.5.6

关于构造函数重载的说法是什么?

  • 默认构造函数可以在同一个类中重载。
  • 可以在子类中重载默认构造函数。
  • 构造函数必须使用不同的名称。
  • 构造函数必须使用this关键字。

解释

默认构造函数可以在子类中重载。如果没有为类定义构造函数,则编译器将自动提供默认构造函数。因为子类可以定义自己的构造函数而不影响超类,所以可以定义一个带参数的构造函数,它可以隐式或显式地调用超类构造函数。

默认构造函数不能在同一个类中重载。这是因为一旦在类中定义了构造函数,编译器就不会创建默认构造函数。因此,尝试重载默认构造函数将有效地将其从类中删除。

构造函数不能使用其他名称。在同一个类中,重载的构造函数使用相同的名称。因为子类的名称与它们的超类不同,所以重载的构造函数将具有不同的名称。

构造函数不需要使用this关键字。 this关键字允许构造函数引用其他构造函数方法和/或实例上下文。在重载的构造函数中不需要使用this关键字。

目标:

使用方法和封装

子目标:

创建并重载构造函数

3 个答案:

答案 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)

首先,overloadoverride不同。例如:

class Foo {
  void overloadedMethod() {}

  void overloadedMethod(int i) {}

  void overridenMethod() {}
}

class Bar extends Foo {
  @Override
  void overridenMethod() {}
}

构造函数可以像普通方法一样重载,但不能覆盖。

有关详细信息,请参阅此处:link