在方法 `outerMethod` 中定义局部内部类 `LocalInner`,`LocalInner` 包含一个方法 `innerMethod`。`outerMethod` 内部实例化了 `LocalInner` 的对象 `innerObj`。如果 `innerMethod` 中试图访问 `outerMethod` 中的局部变量 `outerVar`,且 `outerVar` 未声明为 `final` 或 `effectively final`,同时存在一个同名的实例变量 `outerVar` 在包含 `outerMethod` 的外部类中,则以下哪个描述最准确?
答案解析
选项A错误,局部内部类虽然可以访问外部类的实例变量,但必须通过`外部类名.this.变量名`的方式显式调用,否则会优先查找局部内部类所在方法的局部变量,而不是外部类的实例变量。选项C错误,当局部变量 `outerVar` 未声明为 `final` 或 `effectively final`时,局部内部类不能直接访问,Java8中要求访问的局部变量隐式或显式声明为final,否则编译不通过。选项D错误,局部内部类并没有持有所访问变量的引用,而是拷贝一份值,且编译阶段未保证拷贝的数据一致性会抛出异常。选项B正确,局部内部类只能访问定义该局部内部类的方法中声明为 `final` 或 `effectively final` 的局部变量。如果局部变量不是final或者effectively final,则在编译期会报错。
正确答案:B