2010-10-11 35 views
10

我有一个类“ClassA”,它具有私有构造函数。如何解决隐式超级构造函数classA()不可见。必须显式调用另一个构造函数'?

public final class ClassA{ 
    private ClassA{ 
    } 

    public static void main(String[] arg) }{ 
    ; 
    ; 
    ; 
    } 
} 

现在,我扩展类的ClassA的“

public class ClassB extends ClassA{ 
    public static void main(String[] arg) }{ 
     ; 
     ; 
     ; 
     } 

} 

现在[最终关键字在此之前删除],我收到Implicit super constructor classA() is not visible. Must explicitly invoke another constructor。这是什么意思,以及如何解决这个问题?

注意我无法更改ClassA构造函数的访问说明符。

+1

我以为你注意到你不能改变访问ClassA的构造函数... – Bivas 2010-10-11 08:40:17

+0

@Bivas:是的,但似乎没有人回答,除了改变私人公共/保护 – 2010-10-11 14:05:24

+1

我做了(构图解决方案):-) – Bivas 2010-10-11 16:02:01

回答

6

将ClassA的构造函数可见性从private更改为protected

构造函数始终通过调用超类的构造函数开始。如果构造函数明确包含对超类构造函数的调用,则使用该构造函数。否则就暗含无参数的构造函数。如果无参数构造函数不存在或对子类不可见,则会出现编译时错误。

+0

由于所有答案都是关于更改访问说明符,所以我接受了首先出现的那个。 :) – 2010-10-11 08:06:28

2

private ClassA{}更改为protected ClassA{}听起来像是一个很好的解决方案。

父构造函数总是在子类中调用:隐式或不隐式。所以,你的ClassB定义等同于

public ClassB extends ClassA { 
    public ClassB() { 
     super(); 
    } 

    // all other methods you have go here... 
} 

如果ClassA唯一的构造函数是私有的,它不能从ClassB调用。

2

Java将隐式创建一个没有ClassB参数的构造函数,它将调用super()。在你的情况下,ClassA中的构造函数是不可见的,因此你得到的错误。将公开或保护的可见性更改将解决错误。

+1

我无法将构造函数更改为公共 – 2010-10-11 08:02:24

7

我建议组成,而不是继承(也许这就是的ClassA设计用于类用法举例:

 
public class ClassB { 
    private ClassA classA; 

    ClassB() { 
     // init classA 
     ... 
    } 

    public ClassA asClassA() { 
     return classA; 
    } 

    // other methods and members for ClassB extension 
} 

您可以委派从ClassB方法ClassA或者覆盖

相关问题