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

在Java嵌套类中,封闭类可以访问内部类的私有成员吗?

王俊楚
2023-03-14
问题内容

在Java中,内部类可以访问封闭类的私有成员。但是外层可以访问内层的私有成员吗?这与内部类是否静态无关。我认为这是不正确的,但是以下代码似乎可以编译并正常工作。

public class Outer {
    class Inner {
        private int i = 0;
        private Inner() {}
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        Outer.Inner oi = o.new Inner();
        oi.i = 10;
    }
}

问题答案:

是的,没关系。从JLS,第6.6.1节中:

否则,如果声明了成员或构造函数private,则仅当访问发生在封装成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。

您甚至可以在另一个嵌套类型Y中引用嵌套类型X的私有成员,只要它们共享顶级类即可。

在字节码级别,我相信所有这些都是通过添加综合包访问方法来实现的。



 类似资料:
  • 问题内容: 谁能告诉我私人会员的访问级别?我一直对这段代码感到困惑:为什么可以在外部类的“打印”方法中访问Line类的私有成员k? 问题答案: 规则在有关可访问性的JLS章中 否则,如果声明了成员或构造函数,则仅当访问发生 在封装成员或构造函数的声明的顶级类(第7.6节)的主体内 时,才允许访问 。 在这里,成员字段在类中声明。当您在方法中访问它时,您正在 包含该 成员 的声明的顶级类的主体中对其

  • 我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?

  • 问题内容: 我观察到外部类可以访问内部类的私有实例变量。这怎么可能?这是演示相同代码的示例代码: 为什么允许这种行为? 问题答案: 内部类只是一种将真正属于原始外部类的功能完全分开的方法。当你有两个要求时,可以使用它们: 如果是在单独的类中实现的,那么外部类中的某些功能将最为清晰。 即使在单独的类中,该功能也与外部类的工作方式紧密相关。 鉴于这些要求,内部类可以完全访问其外部类。由于它们基本上是外

  • 我一直在试图理解java中嵌套类的机制。 考虑以下代码: } 我知道内部类是编译器的一种现象,虚拟机不知道它们。内部类被翻译成带有$分隔外部和内部类名的常规类文件。 为了更详细地理解这种机制,我尝试使用javap-p命令反汇编在java版本1.8中编译的类文件。 我得到了以下结果:OuterClass: 内部类: 在这里我们可以看到编译器通过构造函数将外部类的引用传递给内部类,以便它可以评估外部类

  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过

  • 我创建了一个简单的列表类。我想做的是在 SLList 中创建一个方法来为 SLList 对象提供大小。我想以递归方式执行此操作,但是,我创建的以下 size() 方法不起作用。我知道其他实现它的方法,例如创建一个帮助器方法。但我好奇的是,为什么我的尺寸()不起作用?错误消息是“大小 () 未定义为 SLList.IntNode”。为什么?既然我使嵌套的IntMode类只是公共的和非静态的,为什么它