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

Java 当超类的构造函数不存在时调用它';不存在,java,class,subclass,superclass,Java,Class,Subclass,Superclass,如果我有以下关于java理论测试的问题,正确答案是什么 问题/任务: 创建一个从Shape类继承的Circle类,并在其构造函数中调用Shape类构造函数。形状类别: public class Shape { private int size; } 选择正确答案: A: B: “无法调用形状类的构造函数,因为它不存在” 有人说正确答案是B,但我不明白为什么不能是A? Java不会创建默认构造函数并调用它吗?根据官方Java语言规范(JLS),: 如果类不包含构造函数声明,则隐式声明默认

如果我有以下关于java理论测试的问题,正确答案是什么

问题/任务:

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

public class Shape {
    private int size;
}
选择正确答案:

A:

B:

“无法调用形状类的构造函数,因为它不存在”

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

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

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

通读该部分可以看出,当编译
Shape
时,它会得到一个构造函数,就像

public Shape() {}
它是
public
,因为
Shape
是公共的,并且隐式调用
super()因为它是空的

很明显,你是对的,选项A就是答案

但是B选项呢?碰巧,JLS的下一节(第节)将详细介绍如何创建不可实例化的类:

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

实际上,如果手动将
private
空构造函数声明为
Shape
,则无法对其进行扩展,因为在
Circle
中调用
super()
无法解析:

private Shape() {}

选择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;
}

您只向我们展示了一个选项,但是请注意,
Shape
类应该有一个默认构造函数,并且您应该能够调用它。是的,它会。不编写构造函数与使用默认的空构造函数相同。没有构造函数的类是不存在的。也就是说,存在私有构造函数。因此,虽然有一种方法可以获得错误消息(或者至少有一种类似的方法),但在这种情况下不会发生。我必须说,这其实不是一个可怕的问题。它当然是具体的,你已经花了一些精力去理解它。这类问题通常不是这样的。如果Shape类是private,那么它的空默认构造函数是public还是private?我试图运行以下代码:
public class Container{private class Shape{private int size;}class Circle扩展Shape{Circle(){super();}}}}public void initCricle(){Circle k=new Circle();System.out.println(“hello”);}
,它运行时没有错误。@raporoid。它将是私有的。构造函数的访问修饰符与类的访问修饰符相同。@raporoid。根据第8.8.9节中的bullet#1:>默认构造函数与类具有相同的访问修饰符,除非类缺少访问修饰符,在这种情况下,默认构造函数具有包访问权限。是的,嵌套私有类是触发错误的另一种方式。因此,如果Shape是私有的,答案可能是B?好的,谢谢:)但是。。那么为什么我的例子有效呢?
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;
}