首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么外部Java类可以访问内部类私有成员?

为什么外部Java类可以访问内部类私有成员?
EN

Stack Overflow用户
提问于 2009-11-26 13:34:05
回答 7查看 98.7K关注 0票数 190

我观察到外部类可以访问内部类的私有实例变量。这怎麽可能?下面是一个示例代码,演示了这一点:

代码语言:javascript
复制
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??
    }
}

为什么允许此行为?

EN

回答 7

Stack Overflow用户

发布于 2012-02-28 16:54:40

如果您想隐藏内部类的私有成员,您可以定义一个具有公共成员的接口,并创建一个实现此接口的匿名内部类。示例如下:

代码语言:javascript
复制
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
    }
}
票数 64
EN

Stack Overflow用户

发布于 2009-11-26 14:01:18

内部类(出于访问控制的目的)被认为是包含类的一部分。这意味着对所有私人的完全访问权限。

实现方法是使用合成的包保护方法:内部类将被编译为同一个包中的单独类(ABC$XYZ)。JVM不直接支持这种级别的隔离,因此在字节码级别,ABC$XYZ将具有外部类用来访问私有方法/字段的包保护方法。

票数 59
EN

Stack Overflow用户

发布于 2014-08-08 19:30:07

Thilo为你的第一个问题“这怎么可能?”添加了一个很好的answer。我想对第二个被问到的问题做一点阐述:为什么允许这种行为?

对于初学者来说,让我们非常清楚的是,这种行为并不局限于内部类,根据定义,内部类是非静态嵌套类型。所有嵌套类型都允许此行为,包括嵌套枚举和接口,它们必须是静态的,并且不能具有封闭实例。基本上,该模型是对以下语句的简化:嵌套代码可以完全访问封闭代码-反之亦然。

那么,为什么呢?我认为一个例子能更好地说明这一点。

想想你的身体和大脑。如果你在手臂上注射海洛因,你的大脑就会兴奋起来。如果你大脑的杏仁核区域看到他认为是对你个人安全的威胁,比如一只黄蜂,他会让你的身体转向另一个方向,跑向山丘,而你不会再“想”这一点。

因此,大脑是身体固有的一部分--奇怪的是,反过来也是如此。在这种紧密相关的实体之间使用访问控制将丧失其关系的权利。如果您确实需要访问控制,那么您需要将类更多地划分为真正不同的单元。在此之前,它们是同一个单元。进一步研究的一个驱动示例将是查看Java Iterator通常是如何实现的。

从封闭代码到嵌套代码的无限制访问使得在大多数情况下,向嵌套类型的字段和方法添加访问修饰符是相当无用的。这样做会增加混乱,并可能给Java编程语言的新手带来一种错误的安全感。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1801718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档