2012-09-22 176 views
22

這是一個更多的拼圖比問題。我有以下代碼:嵌套類中的私有構造函數的範圍

public class PrivateBaseConstructor { 
    public static class BaseClass { 
     private BaseClass() { 
     } 

    } 

    public static class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 
} 

這裏呼籲​​1 *允許情況下,雖然基類的構造函數是private。如果我們寫的類作爲單獨的班,同一個包:

BClass.java 
public class BClass { 
    private BClass() { 

    } 
} 

DClass.java 
public class DClass extends BClass { 
    public DClass() { 
     super(); // 2* 
    } 

編譯器示意這是在2 *錯誤,因爲基類構造函數是不可見的。

爲什麼編譯器在我的第一個場景中不會引發錯誤,當這兩個類在一個類中聲明爲靜態時?

回答

1

由於在類中聲明的任何內容都可以訪問其私有成員,包括內部類。但是,如果您在課堂上運行PMD,則會發現它表明您將構造函數的可見性更改爲非私有。

4

因爲嵌套類可以看到每個其他成員。這與靜態聲明無關。請參閱以下僅使用嵌套內部類(不是靜態)的代碼示例。

public class PrivateBaseConstructor { 
    public class BaseClass { 
     private BaseClass() {} 
    } 

    public class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 

    public static void main(String[] args) 
    { 
     new PrivateBaseConstructor(). new DerivedClass(); 
    } 
} 

瞭解更多關於嵌套類在這裏:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html