java - java中内部类访问外部类

标签 java inner-classes nested-class

I know about inner class and nested class from 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);

最佳答案

But can any body tell me what's the difference between Inner.redo1() and 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

}

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


Why does it use ArrayList.this.remove(lastRet); but not remove(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

关于java - java中内部类访问外部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409210/

相关文章:

java - Wicket 口 : Notify if page model has been changed

java - 将 java 类方法添加到新线程中

java - 编译器正在创建带有 $ 的额外类文件

java - 如何使用 Rjb 访问嵌套静态类?

java - 应用程序在 android 11 上崩溃 : java. lang.ExceptionInInitializerError

java - 在 google app engine for java 中使用 xml rpc 客户端 - 超时时间为 30 秒? - 如何使用低级 API 进行访问

java - 请问a.b和a$b有什么区别?

java - 在封闭类的父类(super class)型声明中使用嵌套类型作为泛型类型参数

java - 接口(interface)中的嵌套类

C# 递归反射