如何访问封闭类的实例?

时间:2015-10-08 20:27:53

标签: java nested-class

我的问题,用抽象的术语来说:

非静态内部类如何访问封闭类的实例?为了在实例调用中使用实例作为参数以及访问内部类和封闭类之间具有相同名称的方法和变量,这是必需的。

与关键字thissuper一样,允许您访问类和父级中具有相同名称的特定版本的方法和变量,是否有关键字可以访问封闭类中的方法和变量的版本封闭的课程?

如果您感到困惑,请继续阅读:

考虑以下代码示例,包含两个类和一个内部类。 Main和Outer是包“myPackage”中的两个类(在旁注中,由于未知原因,我无法使用以下代码在没有包/默认包的情况下工作)。 Inner是Outer的内部非静态类。

package myPackage;

public class Outer {
    public void activate() {
        System.out.println("Outer.activate");
    }

    public class Inner {
        public void go() {
            activate();
        }
    }
}
package myPackage;

import myPackage.Outer.Inner;

public class Main {

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

请注意,我使用Inner构建myOuter.new Inner()。由于Inner是非静态的,因此必须在其封闭类的现有实例之上构建:在本例中为myOuter。因此,当我致电myInner.go()时,myInner会调用activate(),这会在其封闭类的链接实例上调用activate()。因此myInner调用myOuter.activate(),输出为:

  

Outer.activate

现在,请考虑以下更改:

package myPackage;

public class Outer {
    public void activate() {
        System.out.println("Outer.activate");
    }

    public class Inner {
        public void activate() {
            System.out.println("Inner.activate");
            activate();
        }
    }
}
package myPackage;

import myPackage.Outer.Inner;

public class Main {

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

现在,当我致电myInner.activate()时,myInner输出,然后拨打activate()。但是,由于Inner现在有一个名为activate()的方法,myInner使用该版本而不是封闭类实例中的版本。因此myInner调用myInner.activate(),输出为:

  

Inner.activate

     

Inner.activate

     

Inner.activate

     

Inner.activate

     

Inner.activate

     

Inner.activate

     

...

反复出现,并以堆栈溢出错误结束。所以我在这个上下文中的问题是如何更改Inner.activate()以使其输出,然后调用其封闭的实例版本activate()而不是它自己的版本。输出将是:

  

Inner.activate

     

Outer.activate

提前感谢您的协助。

1 个答案:

答案 0 :(得分:3)

您可以通过将类的名称预先挂起到this关键字来访问外部类的this,如下所示:

Outer.this.activate();

这解析了this引用外部类的对象的范围,该对象隐式存储在非静态内部类的对象中。

Demo.