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

4
我想知道以下代码在Java中是否有效:
```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 {

    }

}

基本上,我在这里试图实例化一个内部类对象,从外部类的当前实例实现,而不是新实例中。我相信这非常方便,当外部类的构造函数不为空(需要参数),且我们不知道传递给它们什么(因为有些可能被分配给被内部类对象访问的类变量,不能为null)。
如果我表达不清,请告诉我。
先谢谢了!

我不明白...你是想为每个OuterClass实例初始化一个InnerClass实例吗?为什么不能在构造函数中完成,或者使用getInnerClass()方法呢? - amit
是的,每次实例化外部类时,也会实例化一个内部类对象,但我需要从外部类的当前对象中实例化该内部类对象,而不是从新对象中实例化。 - romeroqj
每个内部类(除非定义为static)都与外部类“连接”,并且不能在没有它的情况下实例化。 - amit
3个回答

10

关于:

public class OuterClass {

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

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

   class InnerClass {

   }

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

因此,这是不必要的:

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

这在实例方法中是可以的:

InnerClass ic = new InnerClass();

如果你在OuterClass中的静态方法(例如main方法)中创建一个InnerClass对象,情况会变得更加棘手。 在这种情况下,你需要更加明确:

以下代码是行不通的:

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
    }

谢谢!如果我想从内部类访问外部类变量,我可以执行InnerClass ic = new InnerClass()吗? - romeroqj
@horhay(jorje?):试试吧!这就是Java编译器的作用——你自己的编程实验室。 - Hovercraft Full Of Eels
我完全着迷于这个(最后一段代码)能够工作。你有什么资源可以更深入地了解发生了什么吗?我仍然不明白那段代码是如何使内部类可访问的。 - AdamMc331
你能描述一下为什么我们需要每次在外部初始化内部类时调用this.new吗?我的问题只涉及到new前面的"this."。 - Neeraj Yadav

4

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

以下代码无效:

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

然而,这将起作用,因为使用了 static 关键字,它不需要 Outer 的实例:

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

更多信息:Java内部类


1
上面是在外部类内和外部类外创建内部类对象的示例:
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();
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接