2017-03-21 143 views
-1

與供應商API的工作,我需要設置一個內部類的一些參數,但我得到異常:類型 非法封閉實例規範OuterClass.InnerClass 的「OC。新將InnerClass()初始化靜態內部類

OuterClass oc = new OuterClass(); 
OuterClass.InnerClass rc2 = oc.new InnerClass(); 

閱讀內部類後,特別是靜態內部類,我可以使用實例化:

OuterClass.InnerClass myInnerClass = new OuterClass.InnerClass(); 
myInnerClass.setName("John"); 

我的問題是,如何實現

MyParentClass parentClass = new MyParentClass(); parentClass.setOuterClassObject(outerClassObject) 時,我從來沒有實例化對象在OuterClass。

基本上我想在MyParentClass上設置一個填充的outerClass(帶有innerClass變量)。

+3

靜態內部類*沒有*任何外部類對象。這就是靜態的意思。我不太明白你想達到什麼。 – Boann

回答

0

InnerClass的範圍是OuterClass。所以你可以在OuterClass的方法內部訪問它。在這種情況下,就像創建其他類一樣創建類的實例。

public class OuterClass 
{ 
    class InnerClass 
    { 
    public InnerClass() { super(); }; 
    public bar() {}; 
    } 

    private void foo() 
    { 
    InnerClass aic = new InnerClass(); 
    aic.bar(); 
    } 

} 

嵌套類是它的封閉類的成員。非靜態嵌套類(內部類)可以訪問封閉類的其他成員,即使它們被聲明爲私有。靜態嵌套類不能訪問封閉類的其他成員。作爲OuterClass的成員,可以將嵌套類聲明爲private,public,protected或package private。 (回想一下,外部類只能被聲明爲public或包專用。)

public class OuterClass 
{ 
    private class NonStaticInnerClass 
    { 
    public bar() { foo(); }; 
    } 

    private static class StaticInnerClass 
    { 
    public bar() { foo(); }; // Compiler error!!! 
    } 

    private void foo() {} ; 
} 

沒有辦法訪問在OuterClass之外將InnerClass(它是不確定的),但你可以訪問它的接口:

public interface IInterface 
{ 
    public void bar(); 
} 

public class OuterClass 
{ 
    class InnerClass implemets IInterface 
    { 
    public InnerClass() { super(); }; 
    public void bar(); 
    } 

    private InnerClass ic; 

    public IInterface getIInterface() { return ic; }; 
} 

public class AnotherClass 
{ 
    private OuterClass oc; 

    public foo() 
    { 
    IInterface iI = oc.getIInterface(); 
    iI.bar(); 
    } 
}