从当前外部类对象实例化内部类对象

时间:2011-10-22 01:19:04

标签: java inner-classes

我想知道以下内容在Java中是否有效:

class OuterClass {

    OuterClass(param1, param2) {
        ...some initialization code...
    }

    void do {
       // Here is where the doubt lays
       OuterClass.InnerClass ic = this.new InnerClass();
    }

    class InnerClass {

    }

}

基本上我在这里想要实现的是从外部类的当前实例实例化内部类对象,而不是新实例,即当前实例。我相信这很方便,因为外部类的构造函数不为空(接受参数)而我们不知道传递给它们的是什么(它们不能为空,因为有些可能被分配给类变量由内部类对象访问。)

如果我解释得很好,请告诉我。

提前致谢!

3 个答案:

答案 0 :(得分:8)

关于:

public class OuterClass {

   OuterClass() {
       // ...some initialization code...
   }

   void doSomething() {
      OuterClass.InnerClass ic = this.new InnerClass();
   }

   class InnerClass {

   }

您不需要显式的OuterClass标识符,也不需要它们,因为它们是隐含的。

所以这是不必要的:

OuterClass.InnerClass ic = this.new InnerClass();

这在实例方法中很好:

InnerClass ic = new InnerClass();

如果你在一个静态方法中创建一个InnerClass的对象,比如在OuterClass中保存的main,那么事情会变得更糟。在那里你需要更明确:

这不起作用

public class OuterClass {
    public static void main(String[] args) {
       InnerClass otherInnerVar = new InnerClass(); // won't work
    }

但这样可以正常工作:

public class OuterClass {
    public static void main(String[] args) {
       InnerClass otherInnerVar2 = new OuterClass().new InnerClass(); // will  work
    }

答案 1 :(得分:3)

除非将类声明为static,否则内部类的每个实例都必须具有外部类的“连接”实例,才能进行实例化。

这不起作用:

public class Outer {
    public class Inner { 
    }
    public static void main(String[] args) {
        Inner inner = new Inner(); //compilation error
    }
}

但是,由于使用了Outer关键字,因此无法使用static的实例:

public class Outer {
    public static class Inner { 
    }
    public static void main(String[] args) {
        Inner inner = new Inner(); 
    }
}

更多信息:java inner classes

答案 2 :(得分:0)

上面是在外部类和外部外部类中创建Inner类对象的示例:

public class OuterClass {

public class InnerClass{

    public void myMethod(){
        System.out.println("inside inner class");
    }
}

public void myMethod(){
    System.out.println("outer class method");
    InnerClass class1 = new InnerClass();
    class1.myMethod();
}

public static void main(String[] args){
    //OuterClass.InnerClass class1 = new OuterClass().i
    OuterClass outerClassObj = new OuterClass();
    OuterClass.InnerClass innerClassObj = outerClassObj.new InnerClass();
    innerClassObj.myMethod();
}
}