Java 创建了多少本地方法匿名类?
以这一类为例:Java 创建了多少本地方法匿名类?,java,anonymous-inner-class,Java,Anonymous Inner Class,以这一类为例: public class Activity { public ArrayList<testInterface> containerListener = new ArrayList<testInterface>(); public void metodoDiProva(int num) { final int finalNum = num; containerListener.add(new testIn
public class Activity {
public ArrayList<testInterface> containerListener = new ArrayList<testInterface>();
public void metodoDiProva(int num) {
final int finalNum = num;
containerListener.add(new testInterface() {
@Override
public void metodoDiProva() {
System.out.println(finalNum);
}
});
}
}
假设metodoDiProvaint num被调用了2次,例如:
因此,在侦听器的arrayList中有2个对象:
第一个侦听器对象可以使用finalNum变量,该变量的值为10。
第二个侦听器对象可以使用finalNum变量,该变量的值为20。
问题是:
内存中有2个不同的内部类,或者只有1个?不,只有一个内部类;有两个例子。编译Activity时,您将看到两个.class文件:Activity.class和Activity$1.class,其中Activity$1.class表示匿名内部类。好的,谢谢,那么谁保留finalNum变量的值,其中第一个侦听器的值是10,第二个侦听器的值是20?listenerObject?我的意思是:匿名类的实例是否保留了最终变量的值?内部类在幕后为局部变量获取隐式成员变量。这也是为什么Java 8中的局部变量必须是final或实际上是final,这样副本的值才能保证在内部类和封闭类之间保持一致。这是可以理解的,但是如果你查看代码,对于firstListener,final变量的匿名类中的值是10,对于匿名类中的第二个侦听器,值为20。你对我说只有一节课。所以谁为第一个侦听器保留值10,为第二个侦听器保留值20?仍然是内部匿名类还是内部匿名类的实例?@GiovanniFar您可以使用反射查看匿名类的字段。如果对字段f使用实例:containerListener.get0.getClass.getDeclaredFields{System.out.printlnf;}您将看到类似于private final int name.of.package.YourClass$1.val$num的内容,这意味着匿名类$1具有存储参数num的值的字段val$num。@GiovanniFar匿名内部类的每个实例都在隐含的实例变量中维护自己的值。匿名内部类的第一个实例的值为10,第二个实例的值为20。
public void metodoDiProva(int num) {
final int finalNum = num;
containerListener.add(new testInterface() {
@Override
public void metodoDiProva() {
System.out.println(finalNum);
}
});
}
activityObj.metodoDiProva(10);
activityObj.metodoDiProva(20);