有效最终 - 内部类访问

时间:2016-10-06 06:30:14

标签: java java-8

内部类只能访问最终或有效的最终变量。我不明白,为什么无论如何都可以访问实例变量,但局部变量和方法参数必须至少有效地最终?

请考虑以下代码:

public class BookStore {   

    private static final int taxId = 300000;   
    public String name;   

    public String searchBook(final String criteria) {      
        int count = 0;      
        int sum = 0;      
//      name = "";      I can uncomment this -> no compile error
        class Enumerator {         
            String interate(int k) {    
                System.out.println(name);
                System.out.println(sum);
                return "";         
            }             
        }            
//      sum++;      If I uncomment this, a compile error will be thrown.
        return "";
    }

}

为什么局部变量+方法参数需要有效最终?

2 个答案:

答案 0 :(得分:1)

这是因为局部变量的范围。它们的范围是声明它们的方法。一旦执行离开该方法,它们就不再有效。但是,诸如Enumerator类之类的内部类可以继续执行方法,例如,通过返回对类实例的引用。

因此,可以在声明它的方法之外访问Enumerator类及其方法。此时,它需要假设它引用的局部变量具有与执行实例化类时相同的值。

对于实例变量,这些变量和内部类的范围是相同的 - 只要父类实例存在,它们都可用。

答案 1 :(得分:1)

创建实例时,所有关于捕获的值都是如此。实例上下文中的内部类总是捕获不可变的外部this引用¹,通过它可以访问,可变或不可访问实例字段。相反,局部变量只能通过其值捕获,因此,变量不得更改,以与捕获的值保持一致。

这是一个设计决定。从技术上讲,a)允许后续的突变不会被内部类的状态或b反射,将每个共享的局部变量包装到一个对象中,以允许像外部类的实例字段一样的突变,但不允许语言设计者认为不一致或非本地不变的局部变量。

¹这与lambda表达式不同,后者仅在实际访问实例变量时捕获this