在Outer类之外创建Inner类对象时的外部对象引用

时间:2017-01-15 04:37:18

标签: java reference inner-classes

可以使用Outer_class_object.new inner_class()在外部类之外实例化内部类。但问题出现了外类对象会发生什么?表示没有引用它的引用变量。显然它将在堆上,直到内部类对象在堆上,因为Inner类以外部类为基础。那么java在这种情况下使用什么机制? 请参阅以下代码...
我们用于创建内部类对象的NormalInnerClassDemo主体中的外部类对象会发生什么。它必须保持活力,直到内心的'是没有参考变量指的是它没有资格进行垃圾收集?如果不是Java怎么设法告诉垃圾收集器不这样做?

class Outer {

    private String  string = "Google";

    class Inner {

        public Inner() {
            System.out.println("From Inner:" + string );
        }
    }

    public void test() {
        //Some code here
    }
}

public class NormalInnerClassDemo {

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

2 个答案:

答案 0 :(得分:1)

  

可以使用Outer_class.inner_class在外部类之外实例化内部类。

不,他们不能。它们是通过以下方式创建的:

outer.new Outer.Inner(...)

其中outer是一个主表达式,用于计算对Outer实例的引用,例如new Outer(...)

this.new Inner(...)

如果你在Outer内,或简称

new Inner(...)

如果你在Outer内。

  

但问题出现了外类对象会发生什么?表示没有引用它的引用变量。

哦,是的,有:见上文。

  

显然它会在堆上,直到内部类对象在堆上,因为Inner类以外部类为基础。那么java在这种情况下使用什么机制?

你的问题是建立在一个错误的基础上的。

答案 1 :(得分:-1)

首先这是Java,所以当VM为你清理时你为什么担心堆内存? 8 - )

为了帮助您理解这一点,请将以下内容添加到外部类(默认构造函数):

Outer() {
  System.out.println("Outer()");
}

然后运行程序,你也会看到Outer也被创建了。很高兴您对如何/创造了什么感兴趣。