Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建了多少本地方法匿名类?_Java_Anonymous Inner Class - Fatal编程技术网

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);