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/