当前位置: 首页 > 面试题库 >

Java内部类可见性难题

东门晓博
2023-03-14
问题内容

考虑以下情况:

public class A {
  public A() { b = new B(); }
  B b;
  private class B { }
}

从Eclipse中的警告中,我引用:Java编译器通过合成访问器方法模拟构造函数AB()。我想编译器现在可以继续进行,并为B创建一个额外的“水下”构造函数。

我觉得这很奇怪:为什么类B在A的ako字段中不可见?并且:这是否意味着B类在运行时不再是私有的?并且:为什么B类的protected关键字表现不同?

public class A {
  public A() { b = new B(); }
  B b;
  protected class B { }
}

问题答案:

内部类本质上是Java
1.1中引入的一种hack。JVM实际上没有任何内部类的概念,因此编译器必须将其绑定。编译器在类A的“外部”生成类B,但在同一包中,然后向其添加综合访问器/构造函数,以允许A对其进行访问。

当给B一个受保护的构造函数时,A可以访问该构造函数,因为它在同一包中,而无需添加合成构造函数。



 类似资料:
  • 我面对java内部类,我在外部变量可见性方面遇到了一些麻烦。 如果内部和外部类之间没有可见性限制,为什么我不能做这样的事情(见“这里”标签)?我真的不理解这些规则。

  • 问题内容: 我正在Kotlin中开发一个Android 密码库。我有几个类在Java应用程序中公开可见。在文档中找到了这一点。 声明成为Java。类的成员会经历名称重整,以使其更难从Java中意外使用它们,并允许重载具有相同签名但根据Kotlin规则彼此不可见的成员。 有办法解决这个问题吗? 问题答案: 我已经看到您所有的内部类都涉及加密和解密。 您可以通过定义一个顶级函数并将其标记为 ,然后将E

  • 我必须在Java中实现一个名为的接口。 假设是我编写的实现graph的类。 我想创建一个内部类以便“封装”类型的元素。 问题是我不明白内部类应该是还是、还是以及它的实例变量应该声明为还是。对于我将要在中插入的一些最终方法也是如此。 基本上,类节点应该像C语言中的记录类型(带有),并且外部类应该能够访问节点的所有实例变量,而不需要观察器、getter等。

  • 假设您正在编写一个Android项目(不是库)。所有文件都编译在一起,因此......在这种情况下使用可见性修饰符有任何意义吗?

  • 问题内容: 当我阅读“ 实践中的Java并发性 ” c03时,我对以下程序感到困惑: 由于重新排序和线程可见性,循环可能永远不会停止,或者输出可能为零,但是我已经尝试了很多次,并且输出始终为42。所有原因是我太幸运了吗? 问题答案: 所有的原因是我太幸运了吗? 不必要。这也将取决于您的处理器体系结构和JVM实现。那就是微妙的内存模型问题的问题之一:它们很难在野外复制。

  • 我无法理解内部访问修饰符。在我的例子中,我无法产生任何与公共行为不同的情况。即使我创建了一个jar,我也可以从jar外部访问jar中的内部函数(来自与jar中使用的包无关的不同包)。在文档中使用了术语模块,但我无法找到模块的确切含义。 因此,我的问题是: > kotlin中的模块是什么? 内部访问修饰符与公共修饰符有何不同?