java - 不能直接调用父类(super class)型构造函数——为什么不呢?

标签 java constructor

我有以下 Java 示例类:

public class A { }

public class Super {
    protected Super() { }
    public Super(A a) { }
}

public class Sub extends Super { }

public class Consumer {
    public Consumer() {
        Sub sub = new Sub(new A()); //compiler error
    }
}

编译器错误指出参数不能应用于 Sub 中的默认构造函数,这是完全可以理解的。

我很好奇的是这个决定背后的理由。 Java在Sub中生成默认的空构造函数;为什么在这种情况下不能在幕后调用它?这主要是理智的手持情况,还是有技术原因?

编辑

我知道这是语言限制。我很好奇为什么这是语言限制。

编辑 2

似乎,就像通常的情况一样,我离实际工作的代码太近了,看不到全局。我在下面的答案中发布了一个反例,说明了为什么这是一件坏事®。

最佳答案

我认为这是一个可读性和不假设意图的问题。你说

Java generates the default empty constructor; why can't it call it behind the scenes in this case?

但对我来说,Java 在“幕后”隐式调用 Super(A) 构造函数比调用 Super() 更有意义构造函数,忽略 A

就是这样。对于在这种情况下应该(或可能)发生什么,我们已经有两个不同的假设。

Java 语言的核心原则之一是透明性。程序员应该尽可能地通过查看代码来了解会发生什么,有时会牺牲语法级别的便利性或魔力

与此平行的原则是不假设意图:在程序员的意图似乎模棱两可的情况下,Java 语言有时会倾向于编译错误,而不是通过某种(任意或其他)选择算法自动选择默认值。

关于java - 不能直接调用父类(super class)型构造函数——为什么不呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884171/

相关文章:

c++ - 在 Arduino 中初始化 C++ 库

C++ - 构造函数、复制构造函数、 move 构造函数、析构函数

java - 使用 SHARE 属性在 Windows 中内存映射文件(因此文件不会被锁定以防止删除)

java - 将焦点设置在jtable中的指定行上

c++ - 在 C++ 构造函数中使用自动变量

java - 当 bean 构造函数使用参数时 Spring init 失败

java - For 循环显示前一个值和下一个值

java - 从 ArrayList 中删除元素时出现异常?

java - 客户端的 pako 和服务器端的 java

c++ - 关于 C++ 中默认构造函数的奇怪编译器行为