我观察到外部类可以访问内部类的私有实例变量。这怎麽可能?下面是一个示例代码,演示了这一点:
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??
}
}
为什么允许此行为?
发布于 2012-02-28 16:54:40
如果您想隐藏内部类的私有成员,您可以定义一个具有公共成员的接口,并创建一个实现此接口的匿名内部类。示例如下:
class ABC{
private interface MyInterface{
void printInt();
}
private static 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
}
}
发布于 2009-11-26 14:01:18
内部类(出于访问控制的目的)被认为是包含类的一部分。这意味着对所有私人的完全访问权限。
实现方法是使用合成的包保护方法:内部类将被编译为同一个包中的单独类(ABC$XYZ)。JVM不直接支持这种级别的隔离,因此在字节码级别,ABC$XYZ将具有外部类用来访问私有方法/字段的包保护方法。
发布于 2014-08-08 19:30:07
Thilo为你的第一个问题“这怎么可能?”添加了一个很好的answer。我想对第二个被问到的问题做一点阐述:为什么允许这种行为?
对于初学者来说,让我们非常清楚的是,这种行为并不局限于内部类,根据定义,内部类是非静态嵌套类型。所有嵌套类型都允许此行为,包括嵌套枚举和接口,它们必须是静态的,并且不能具有封闭实例。基本上,该模型是对以下语句的简化:嵌套代码可以完全访问封闭代码-反之亦然。
那么,为什么呢?我认为一个例子能更好地说明这一点。
想想你的身体和大脑。如果你在手臂上注射海洛因,你的大脑就会兴奋起来。如果你大脑的杏仁核区域看到他认为是对你个人安全的威胁,比如一只黄蜂,他会让你的身体转向另一个方向,跑向山丘,而你不会再“想”这一点。
因此,大脑是身体固有的一部分--奇怪的是,反过来也是如此。在这种紧密相关的实体之间使用访问控制将丧失其关系的权利。如果您确实需要访问控制,那么您需要将类更多地划分为真正不同的单元。在此之前,它们是同一个单元。进一步研究的一个驱动示例将是查看Java Iterator
通常是如何实现的。
从封闭代码到嵌套代码的无限制访问使得在大多数情况下,向嵌套类型的字段和方法添加访问修饰符是相当无用的。这样做会增加混乱,并可能给Java编程语言的新手带来一种错误的安全感。
https://stackoverflow.com/questions/1801718
复制相似问题