用私有构造函数扩展类

假设我们有以下代码:

class Test { private Test() { System.out.println("test"); } } public class One extends Test { One() { System.out.println("One"); } public static void main(String args[]) { new One(); } } 

当我们创build一个对象One ,它最初被称为父类构造函数Test() 。 但作为Test()是私人的 – 我们得到一个错误。 多less是一个很好的例子和出路这种情况?

没有出路。 你必须创build一个可用的( protectedpublic或默认)超级构造函数来扩展test

这种表示法通常用于实用程序类或单例中,您不希望用户通过扩展和实例化子类来创build自己的类的实例,或者只需调用类的构造函数即可。

当你有一个只有private构造函数的class时,你也可以把class改成final因为它根本不能被扩展。


另一种解决scheme是在test中创build一个test方法,并将每个方法从One调用到一个test实例。 这样你就不必扩展test

 class Test { private Test() { System.out.println("test"); } public static Test getInstance(){ return new Test(); } public void methodA(){ //Some kind of implementation } } public class One { private final Test test; One() { System.out.println("One"); test = Test.getInstance(); } public void methodA(){ test.methodA(); } public static void main(String args[]) { new One(); } } 

使test的构造非private或移动test

顺便说一句,你的示例代码包含几个问题:

  • 类应该被命名为标题情况( Test而不是test
  • 我build议让这个One的构造函数是private除非它是从同一个包中的不同类调用的

其实我find了一条出路 喜欢这个:

 class Base { private Base() { } public void fn() { System.out.println("Base"); } public static class Child extends Base { public void fn() { System.out.println("Child"); } } public static Base getChild() { return new Child(); }} 

现在,您可以使用getChild()来获取扩展类的实例。