2010-11-22 114 views
0

鉴于此代码片断,你能解释它为什么炒作吗?构造函数的私人范围

事情是,类构造函数被标记为private,所以不应该阻止我们用new运算符调用它吗?

public class Alpha { 
protected Alpha() {} 
} 
class SubAlpha extends Alpha { 
private SubAlpha() {System.out.println("ok");} 
public static void main(String args[]) { 
    new SubAlpha(); 
} 
} 

这一切都有效,因为静态方法是类的一部分,它可以看到所有的私有字段和方法,对不对?在这个“新”初始化之外永远不会工作?

回答

5

唯一private构造你的问题是SubAlpha,本身就是调用一个SubAlpha。没有问题,一个班级可以调用它自己的私人方法。 Alpha的构造函数是protected,所以SubAlpha有权访问它。

编辑:重新编辑:是的,正好。 A 单独的类(无论是否为子类)将无法访问SubAlpha的私有构造函数,并且无法成功构造。

实施例1:

public class Beta 
{ 
    public static final void main(String[] args) 
    { 
     new SubAlpha(); 
//  ^--- Fails with a "SubAlpha() has private access in SubAlpha" 
//   compilation error 
    } 
} 

实施例2:

public class SubSubAlpha extends SubAlpha 
{ 
    private subsubAlpha() 
    { 
// ^== Fails with a "SubAlpha() has private access in SubAlpha" 
//  compilation error because of the implicit call to super() 
    } 
} 

这是当然的,构造特有的,因为范围总是构件特异性的。如果一个类具有不同的签名和限制范围较小的不同的构造函数,则使用它的类(包括子类)可以使用该其他构造函数签名。 (如果是子类,则需要明确调用super(args);。)

1

代码的工作方式与主要方法同样在同一个类中。您可能无法从不同的类中初始化SubAplha。