当超类的构造函数不存在时调用它

时间:2018-04-24 02:51:29

标签: java class subclass superclass

如果我对java理论测试有以下问题,那么正确答案是什么?

问题/任务:

创建一个继承自Shape类的Circle类,并在其构造函数中调用Shape类构造函数。形状类:

public class Shape {
    private int size;
}

选择正确答案:

A:

class Circle extends Shape{

    Circle(){
        super();
    }
}

B:

  

"你不能调用Shape类的构造函数,因为它不存在"

有人说正确答案是B,但我不明白为什么它不能成为A? 不管Java创建默认构造函数还是调用它?

2 个答案:

答案 0 :(得分:1)

根据官方Java语言规范(JLS),section 8.8.9

  

如果类不包含构造函数声明,则隐式声明默认构造函数。

阅读该部分表明,编译Shape时,它会获得一个构造函数,就好像由

定义一样。
public Shape() {}

它是public,因为Shape是公开的,并且隐式调用super();,因为它是空的。

很明显,你认为选项A就是答案。

但是选项B怎么样?碰巧的是,JLS的下一部分(8.8.10部分)完全处理如何创建不可实例化的类:

  

可以设计一个类来防止类声明之外的代码通过声明至少一个构造函数来创建类的实例,以防止创建默认构造函数,并通过声明所有构造函数为private§6.6.1)。

实际上,如果您手动向private声明Shape空构造函数,则无法对其进行扩展,因为super()中对Circle的调用正是如此不会解决:

private Shape() {}

答案 1 :(得分:0)

选项A是正确的答案。如果你没有定义它,类总是有构造函数,尽管java内部没有为它定义参数构造函数。所以对于默认构造函数调用它不会给出任何错误。

我发布的示例已成功运行并在控制台上打印了hello。

public class Circle extends Shape {

    public Circle() {
        super();
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        Circle circle =  new Circle();
    }
}

public class Shape {
    private int size;
}