2014-01-15 70 views
0

嵌套靜態類B的受保護的構造考慮下面的代碼:能見度包含在抽象類A

public abstract class AbstractA 
{ 
    public static final class B 
    { 
    protected B(){} 
    } 
} 

// a class (in another package) that inherits from AbstractA 
public class C extends AbstractA 
{ 
    B[] arrayOfB=new B[10]; 
    for(byte i=0; i<=arrayOfB.length; i++) 
    { 
    arrayOfB[i]=new B(); 
    } 
} 

在類別C1可以定義arrayOfB因爲B類是靜態&公開,但我不能實例化的這個對象。 Eclipse的說:構造函數A.B()不可見

如果C類與A類在同一個包中,我可以實例化它。 如何保持構造函數B()受保護並仍然創建一個知道類C繼承自A的對象?

回答

3

這與內部類無關。您的B構造函數受保護,這意味着只有子類可以訪問它,但是您將該類定義爲final,這沒有意義。也許你可以在AbstractA中添加一個工廠方法,創建B實例,外部類可以訪問其內部類,即使是私有方法。

public abstract class AbstractA 
{ 
    protected B newB() {return new B();} 
    public static final class B 
    { 
    private B(){} 
    } 
} 

// a class (in another package) that inherits from AbstractA 
public class C extends AbstractA 
{ 
    B[] arrayOfB=new B[10]; 
    for(byte i=0; i<=arrayOfB.length; i++) 
    { 
    arrayOfB[i]=this.newB(); 
    } 
} 
+0

那是所謂的「靜態工廠」設計模式嗎? – user3111783

+0

@ user3111783「工廠方法」我猜 – kan

2

嵌套的公共靜態類與單獨文件中的公共類相同。所以你不能看到B的構造函數,因爲你不是B的後代,也不在同一個包中。

0

如果你想擴展它的包外的類必須有一個構造函數是公共的還是在Java中,因爲保護每一個構造函數必須從它的超調用構造函數。

(隱含super()調用將失敗。)

0

protected符允許通過有關類別,不管包他們居住在,以及在同一個包中的其他代碼的子類訪問。

對於您的情況,類C駐留在不同的包中,因此由於上述原因您不允許實例化A.B()

請記住,protected說明符只允許在不同的包中繼承。你不能直接訪問它們。

作爲解決您的問題的方法,請將類C移動到與AbstractA相同的包中,以使B可訪問。

+0

@techG:謝謝你指出。我沒有看到。無論如何,我已編輯帖子:-) –