假设我们有以下代码:
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();
}
}
当我们创建一个对象One
时,它最初被称为父类构造函数Test()
。但由于Test()
是私有的 - 我们收到错误。
一个很好的例子和摆脱这种情况的方法是多少?
答案 0 :(得分:43)
没有出路。您必须创建一个可用的(protected
,public
或默认)超级构造函数才能扩展test
。
这种表示法通常用在实用程序类或单例中,在这种情况下,您不希望用户通过扩展它并实例化子类,或者只是调用您的类的构造函数来创建自己的类的实例。类。
如果class
只包含private
个构造函数,您还可以将class
更改为final
,因为它根本无法扩展。
另一个解决方案是在test
中创建一个方法,创建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();
}
}
答案 1 :(得分:1)
将test
非_ private
的构造函数或One
移至test
。
顺便说一下,您的示例代码包含一些问题:
Test
而不是test
)One
的构造函数private
,除非从同一个包中的其他类调用它答案 2 :(得分:0)
实际上,我发现有一条出路。像这样:
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()来获取扩展类的实例。