c++ 嵌套私有类_嵌套类和私有方法

  • Post author:
  • Post category:其他


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中令人