《Java语言规范》(JLS)中哪部分涉及局部类成员的可访问性?局部类访问修饰符无效果的行为是否有规范规定?
关于Java局部类成员可访问性的JLS规定解答
好问题!这确实是Java里一个容易让人困惑的细节,我来结合JLS的具体规定帮你理清:
一、JLS中涉及局部类成员可访问性的章节
局部类的成员可访问性相关内容主要分布在两个核心章节:
- JLS §8.1.3(Local Classes):专门定义了局部类的特性,包括它的作用域、成员的访问规则基础。
- JLS §6.6(Access Control):这是Java访问控制的总纲,其中§6.6.1小节明确了不同上下文下的访问权限规则,局部类的成员访问也遵循这里的核心逻辑——因为局部类的作用域被限定在包含它的方法/代码块内,所以该上下文内的所有代码都能直接访问局部类的所有成员。
二、局部类/匿名类的访问修饰符无效的明确规定
你观察到的「局部类成员的访问修饰符完全不起作用」的现象,JLS里是有明确规定的:
根据**JLS §8.3.1(Field Modifiers)和JLS §8.8.3(Method Modifiers)**的说明:
对于局部类(以及作为局部类特殊形式的匿名类)的字段和方法,
public、protected、private这些访问修饰符是允许书写的,但编译器会直接忽略它们的作用。
这是因为局部类本身就被限定在方法或代码块的内部作用域中,它的成员的访问权限天然由这个包含上下文决定——只要在包含局部类的方法/代码块内,所有代码都能无限制地访问局部类的任何成员,不管你给成员加了什么访问修饰符。
你的代码示例正好验证了这一点:
class Foo { public static void main(String[] args) { class Bar { private int a = 1; protected int b = 2; public int c = 3; } var bar = new Bar(); System.out.println(bar.a); // 可以访问private成员 System.out.println(bar.b); // 可以访问protected成员 System.out.println(bar.c); // 可以访问public成员 } }
这里Bar是main方法内的局部类,main方法作为包含它的上下文,完全不受private/protected修饰符的限制,直接访问所有成员是完全符合JLS规定的。
匿名类也遵循同样的规则:你可以在匿名类的成员上书写访问修饰符,但这些修饰符不会改变任何访问权限,包含匿名类的上下文仍然能访问它的所有成员。
内容的提问来源于stack exchange,提问作者wlnirvana
相关产品推荐
相关产品推荐

