使用私有构造函数扩展 class

Extend a class with private constructer

是否可以使用不可见的构造函数扩展 class 而不必知道此构造函数的作用并再次实现它?

import java.sql.DriverManager;
    
public class myDriverManager extends DriverManager {
    public myDriverManager() {
        super(); //Fehler: the constructor DriverManager() ist not visible
    }
    
}

每个构造函数的第一行要么调用它的超级class构造函数,要么调用任何当前的class构造函数,所以即使你不保留它,编译器也会保留一个super(); 作为第一行。

现在来到 DriverManager,它唯一的构造函数是 private,当您将它扩展到 class 时,它的构造函数将尝试调用 DriverManager 的构造函数根据上述逻辑并给出编译时错误,因为它是私有的并且变得不可见。

即使你不声明没有构造函数的class,情况也是一样的

public class myDriverManager extends DriverManager {
    
}

这也会报同样的错误,因为编译器会创建一个默认的构造函数,它的第一行默认是super();,同样按照上面的逻辑,构造函数又是不可见的。

所以基本上发生的事情是当你扩展 DriverManager 你的 class 必须在其代码的某些部分调用 super();,并给出编译时错误,因此 DriverManager 不能扩展到任何 class.

您不能扩展 DriverManager,但您可以改为实施 DataSource

NOTE: The DataSource interface, new in the JDBC 2.0 API, provides another way to connect to a data source. The use of a DataSource object is the preferred means of connecting to a data source.