编程语言
首页 > 编程语言> > java-多少外部**此**将具有此内部类?

java-多少外部**此**将具有此内部类?

作者:互联网

我有以下内部类的情况.

class Outer {
   private class Inner1 extends InnerBase {
   }
   private class Inner2 extends InnerBase {
   }
   private class InnerBase {
   }
}

通常,我认为内部类比外部类有一个额外的隐藏“ this”.

但是,但是将发生内部类是从另一个内部类派生的吗?

所有内部类(Inner1,Inner2,InnerBase)都应该有一个附加的类.

Inner1,Inner2对外部this有自己的引用吗?
还是只是重复使用InnerBase中的一个,导致行为略有不同?

(隐藏此==指向外部类实例的引用)

解决方法:

在内部,层次结构中的每个非静态内部类都会对此有自己的引用.您可以使用javap进行确认

$javap -private Outer.Inner1
Compiled from "Outer.java"
class Outer$Inner1 extends Outer$InnerBase{
    final Outer this$0;
    private Outer$Inner1(Outer);
}

$javap -private Outer.InnerBase
Compiled from "Outer.java"
class Outer$InnerBase extends java.lang.Object{
    final Outer this$0;
    private Outer$InnerBase(Outer);
    Outer$InnerBase(Outer, Outer$1);
}

顺便说一句,如果您确实想要,您可以利用一些晦涩的Java语法,使父类和子类之间的this $0成员具有不同的值.这是如何做:

public class Outer {
    class InnerBase {
        Outer innerBaseOuter() { return Outer.this; }
    }

    class Inner1 extends InnerBase {
        public Inner1() {}
        public Inner1(Outer parentOuter) {
            parentOuter.super(); // set a different super in InnerBase
        }
        Outer innerOuter() { return Outer.this; }
    }

    public static void main(String[] args) {
        Outer outer1 = new Outer();
        Outer outer2 = new Outer();

        Inner1 a = outer1.new Inner1();
        System.out.println("Checking (a.base == a.inner) => "+
            (a.innerBaseOuter() == a.innerOuter()));

        Inner1 b = outer1.new Inner1(outer2);
        System.out.println("Checking (b.base == b.inner) => "+
            (b.innerBaseOuter() == b.innerOuter()));
    }
}

运行得到的程序:

Checking (a.base == a.inner) => true
Checking (b.base == b.inner) => false

标签:inner-classes,java
来源: https://codeday.me/bug/20191101/1983664.html