方法内部类/匿名内部类 局部变量需要被标记为final 原因

public class InnerClassTest {
	public int classLevel = 0;
	
	public void test(final long innerMethodParam){
		 final Integer methodLevel = new Integer(2);
		new MethodInnerClass(){
			public void innerMethod(){
				Integer a2 = methodLevel;
				int b = classLevel;
				long c = innerMethodParam;
			}};
	}
	class MethodInnerClass{}
}

匿名内部类的构造器部分字节码:

  InnerClassTest.InnerClassTest$1(InnerClassTest.InnerClassTest, InnerClassTest.InnerClassTest, java.lang.Integer, long);
    descriptor: (LInnerClassTest/InnerClassTest;LInnerClassTest/InnerClassTest;Ljava/lang/Integer;J)V
    flags:
    Code:
      stack=3, locals=6, args_size=5
         0: aload_0
         1: aload_2
         2: putfield      #14                 // Field this$0:LInnerClassTest/InnerClassTest;
         5: aload_0
         6: aload_3
         7: putfield      #16                 // Field val

你可能感兴趣的:(Java基础)