Java常量类私有成员变量访问编译错误问题咨询
关于Java常量类私有成员访问问题的解答
首先得先梳理下常见的代码场景(毕竟你没贴代码,但根据描述大概率是内部类/局部类的访问权限问题),再逐个解答你的疑问:
为什么AA和BB能访问私有成员变量i?
假设你的代码结构是外部类(比如叫Constants)包含私有静态常量i,AA是静态内部类、BB是非静态内部类,那原因很简单:
Java的访问权限控制是基于「类」而非「实例」的,内部类(不管静态还是非静态)属于外部类的逻辑组成部分,因此它们天然有权访问外部类的所有私有成员——不管是静态的还是非静态的。
- 静态内部类AA:本身就属于外部类的静态成员,直接可以访问外部类的私有静态常量
i; - 非静态内部类BB:虽然它需要依附外部类实例才能创建,但静态常量
i属于外部类本身,不需要实例就能访问,所以BB也能直接读取i。
为什么CC无法访问自身的私有成员变量i?
这通常是两种场景导致的:
- 你在CC类外部试图直接访问它的私有
i:
比如CC是外部类方法里的局部内部类,你在方法中创建了CC的实例后,直接写cc.i去读取——这违反了私有成员的访问规则,私有成员只能在类内部访问,哪怕是包含它的外部类方法也不行。 - 变量名遮蔽导致你误判访问对象:
如果CC内部的私有i和外部类的i同名,你在CC方法中写i时,其实访问的是CC自己的i(如果是实例变量用this.i,静态变量用CC.i就能明确指定),但如果你误以为访问的是外部类的i,可能会因为其他问题报错,或者你搞反了访问目标。
如何让CC访问自身的私有成员变量i?
分两种情况处理:
- 在CC类内部访问:
直接写变量名即可;如果存在同名变量遮蔽,明确加上this.(实例变量)或CC.(静态变量)来指定访问自身的i,比如:class CC { private int i = 20; public void printI() { System.out.println(this.i); // 明确访问自身的私有实例变量i } } - 在CC类外部访问:
私有成员的设计就是禁止外部直接访问,所以正确的做法是在CC类中提供公共的getter方法,通过方法来暴露私有成员:class CC { private static final int i = 20; public static int getI() { return i; } } // 在外部调用 System.out.println(CC.getI());
如果能贴出具体的代码和javac编译报错信息,还能更精准地定位问题~
内容的提问来源于stack exchange,提问作者JL_SO
相关产品推荐
相关产品推荐

