c++ 嵌套私有类
当您在另一个类中有一个类时,他们可以看到彼此的
private
方法。 在Java开发人员中并不为人所知。 面试过程中的许多候选人说,
private
是一种可见性,它使代码可以查看成员是否属于同一班级。 这实际上是对的,但更准确地说,代码和成员都在一个类中。当我们嵌套了内部类时,
private
成员和使用它的代码可能会出现在同一班级,同时他们也处于不同的班级。
例如,如果我在一个顶级类中有两个嵌套类,则其中一个嵌套类中的代码可以看到另一个嵌套类的
private
成员。
当我们查看生成的代码时,它开始变得很有趣。 JVM不在乎其他类中的类。 它处理JVM“顶级”类。 当您在类
A
有一个名为
B
的类时,编译器将创建
.class
文件,其名称将类似于
A$B.class
。
B
有一个可从
A
调用的
private
方法,然后JVM看到
A.class
中的代码调用
A$B.class
的方法。 JVM检查访问控制。 当我们与初级用户讨论此问题时,有人建议JVM可能不在乎修饰符。 那是不对的。 尝试编译
A.java
和
B.java
,两个顶级班,在一些代码
A
调用一个
public
的方法
B
。 当你拥有
A.class
和
B.class
修改方法
B.java
被
public
是
private
,并重新编译
B
た新
B.class
。 启动应用程序,您将看到JVM非常关心访问修饰符。 不过,您仍可以在上面的示例中从
A.class
调用
A$B.class
的方法。
为了解决此冲突,Java生成了一些固有的公共合成方法,请在同一类中调用原始的私有方法,并且在考虑JVM访问控制的情况下可以调用该方法。 另一方面,如果您找出生成的方法的名称并尝试直接从Java源代码中调用,则Java编译器将不会编译代码。 我在4年前就
写
了详细的文章。
如果您是一位经验丰富的开发人员,那么您可能会认为这是一个奇怪而令人反感的技巧。 除了此hack之外,Java如此干净,优雅,简洁,纯净。 还有可能是
Integer
高速缓存的破解,它使用
==
使小的
Integer
对象(典型的测试值)相等,而较大的值只是
equals()
而不是
==
(典型的生产值)。 但是除了合成类和
Integer
缓存hack之外,Java都是干净,优雅,简洁和纯净的。 (您可能会发现我是Monty Python的粉丝。)
这样做的原因是嵌套类不是原始Java的一部分,而是仅添加到1.1版中。解决方案是一个hack,但是那时还有很多重要的事情要做,例如引入JIT编译器,JDBC,RMI,反思和其他一些我们今天认为理所当然的事情。 那时的问题不是解决方案是否干净。 相反,问题是Java是否将完全存活下来并成为主流编程语言或死掉,并且仍然是一个不错的尝试。 那个时候我还担任销售代表,而编码只是一种爱好,因为东欧的编码工作很少,它们主要是无聊的簿记应用程序,而且薪水低。 那段时间有些不同,搜索引擎名为AltaVista,我们从水龙头里喝水,而Java具有不同的优先级。
结果是20多年来,我们的JAR文件略大,Java执行速度稍慢(除非JIT优化了调用链)以及IDE中令人