lic*_*gwu 2 java nested-class inner-classes
我从Java内部类和静态嵌套类中了解内部类和嵌套类
但是任何人都可以告诉我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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它为什么使用ArrayList.this.remove(lastRet);但不是remove(lastRet);?
但是任何人都可以告诉我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
}
Run Code Online (Sandbox Code Playgroud)
相同的字节码,相同的最终结果,相同的一切.
为什么使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |