从java中的内部类访问外部类

时间:2013-05-07 00:09:09

标签: java inner-classes nested-class

  

我从Java inner class and static nested class

了解内部类和嵌套类

但是,任何人都可以告诉我Inner.redo1()和Inner.redo2()之间的区别是什么?

或者Inner.print1()和Inner.print2()是一样的吗?

public class Outer {
    private String str = "outer";
    public void print() {
      System.out.println("a");
    }

    public class Inner {
        public void redo1() {
            print();
        }
        public void redo2() {
            Outer.this.print();
        }
    }
}

PS:在java.util.ArrayList.Itr中#remove

public void remove() {
    if (lastRet < 0)
        throw new IllegalStateException();
    checkForComodification();

    try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
    } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
    }
}

为什么使用ArrayList.this.remove(lastRet);但不使用remove(lastRet);

2 个答案:

答案 0 :(得分:5)

  

但是,任何人都可以告诉我Inner.redo1()和Inner.redo2()之间的区别是什么?

Inner.redo1()Inner.redo2()确实相同。没有语义或功能差异。 redo2更明确。就是这样。

让我们比较每个方法的字节码:

λ  Desktop  javap -c Outer.Inner
Compiled from "Outer.java"
public class Outer$Inner extends java.lang.Object{
final Outer this$0;

public Outer$Inner(Outer);
  Code:
   0:   aload_0
   1:   aload_1
   2:   putfield    #1; //Field this$0:LOuter;
   5:   aload_0
   6:   invokespecial   #2; //Method java/lang/Object."<init>":()V
   9:   return

public void redo1();
  Code:
   0:   aload_0
   1:   getfield    #1; //Field this$0:LOuter;
   4:   invokevirtual   #3; //Method Outer.print:()V
   7:   return

public void redo2();
  Code:
   0:   aload_0
   1:   getfield    #1; //Field this$0:LOuter;
   4:   invokevirtual   #3; //Method Outer.print:()V
   7:   return

}

相同的字节码,相同的最终结果,相同的一切。


  

为什么使用ArrayList.this.remove(lastRet);但不删除(lastRet); ?

消除实际应该调用哪个类'remove()方法的歧义。在这种情况下实际上是必要的!如果没有明确指定ArrayList.this.remove(lastRet),代码就不会编译:

λ  Desktop  javac java/util/ArrayList.java
java/util/ArrayList.java:810: remove() in java.util.ArrayList<E>.Itr cannot be applied to (int)
                remove(lastRet);
                ^
1 error

答案 1 :(得分:1)

  1. 在您的示例中,它们是相同的。但是如果内部实例和外部实例之间存在显着差异,这将影响print()的结果,那么它们将会有所不同。

  2. ArrayList.this.remove(lastRet)使用remove()引用ArrayList(外部类)实例。 remove(lastRet)将改为生成任何内部类的实例,以使用remove()方法。

  3.   

    “所以内部类的规则引用自身或外部   实例如下:

         

    ■从内部引用内部类实例本身   类代码,使用它。

         

    ■从内部引用“outer this”(外部类实例)   内部类代码。 “

    - 来自Kathy Sierra和Bert Bates的SCJP 6