使用私有构造函数扩展 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.
是否可以使用不可见的构造函数扩展 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.