2017-03-21 117 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(); 
    } 
}