【问题标题】:Extend a class with private constructer使用私有构造函数扩展一个类
【发布时间】:2020-10-21 12:55:22
【问题描述】:

是否可以用不可见的构造函数扩展一个类,而不必知道这个构造函数做了什么并再次实现它?

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

【问题讨论】:

  • 这是因为DriverManager中的构造函数是私有的/* Prevent the DriverManager class from being instantiated. */private DriverManager(){}
  • 如果您打算扩展该类,则该类的作者会将构造函数设为受保护或公开。事实上,你不能扩展它。
  • DriverManager 只是一个例子还是你真的想扩展那个类?这是什么原因?来自 Javadocs:“注意:JDBC 2.0 API 中新增的 DataSource 接口提供了另一种连接数据源的方式。使用 DataSource 对象是连接数据源的首选方式。” - 2.0 版已经发布了很长一段时间了。
  • DriverManager 只是一个例子,因为我实际上尝试过它,但取得了进展并退出甚至不想扩展它^^

标签: java constructor private extends


【解决方案1】:

每个构造函数的第一行都是对其超类构造函数或任何当前类构造函数的调用,因此即使您不保留它,编译器也会将super(); 作为第一行。

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

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

public class myDriverManager extends DriverManager {
    
}

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

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

【讨论】:

    【解决方案2】:

    你不能扩展DriverManager,但你可以实现DataSource

    注意:JDBC 2.0 API 中新增的 DataSource 接口提供了另一种连接数据源的方法。使用 DataSource 对象是连接数据源的首选方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2016-10-22
      相关资源
      最近更新 更多