为什么外部Java类可以访问内部类私有成员?
我观察到外部类可以访问内部类私有实例变量。 这怎么可能? 以下是一个演示相同的示例代码:
class ABC{
class XYZ{
private int x=10;
}
public static void main(String... args){
ABC.XYZ xx = new ABC().new XYZ();
System.out.println("Hello :: "+xx.x); ///Why is this allowed??
}
}
为什么允许这种行为?
内部类只是一种清楚地区分真正属于原始外部类的某些功能的方法。 当你有两个要求时,它们被使用:
考虑到这些要求,内部类可以完全访问其外部类。 由于它们基本上是外部类的成员,因此它们有权访问外部类的方法和属性 - 包括私有。
内部类(为了访问控制的目的)被认为是包含类的一部分。 这意味着完全访问所有私人。
实现的方式是使用合成的包保护方法:内部类将被编译为同一包中的单独类(ABC $ XYZ)。 JVM不直接支持这种隔离级别,所以在字节码级别ABC $ XYZ中将有外部类用来访问私有方法/字段的程序包保护方法。
如果您想隐藏内部类的私有成员,您可以使用公共成员定义一个接口并创建一个实现此接口的匿名内部类。 示例波纹管:
class ABC{
private interface MyInterface{
void printInt();
}
private MyInterface mMember = new MyInterface(){
private int x=10;
public void printInt(){
System.out.println(String.valueOf(x));
}
}
public static void main(String... args){
System.out.println("Hello :: "+mMember.x); ///not allowed
mMember.printInt(); // allowed
}
}
链接地址: http://www.djcxy.com/p/91999.html
上一篇: Why can outer Java classes access inner class private members?