Java中私有静态嵌套类中的访问修饰符

Posted

技术标签:

【中文标题】Java中私有静态嵌套类中的访问修饰符【英文标题】:Access modifiers inside a private static nested class in Java 【发布时间】:2011-05-03 18:44:04 【问题描述】:

我在 Java 中有一个“私有静态”嵌套类。这个类中的字段和方法的访问修饰符有什么意义?我已经尝试过公开和私有,但对我的应用程序没有影响。

public class MyList<T>
    private static class Node // List node
        private Object item;
        private Node next;
        private Node prev;

        private Node(Node next)
            this.next = next;
        

        private static Node doStuff()
    

【问题讨论】:

你能发布你的代码以及你的假设吗 【参考方案1】:

由于是嵌套类,Node 中的所有内容都可以通过MyList&lt;T&gt; 访问,无论访问修饰符如何;因为它是一个私有嵌套类,所以在 Node 中首先声明的任何内容都不会在 MyList&lt;T&gt; 之外可见。

因此,访问修饰符可能很重要的一种情况是覆盖超类方法的方法(例如toString())。您不能降低被覆盖方法的可见性。 toString() 必须始终声明为 public 才能编译类。

还需要注意的是,当外部类访问私有成员时,编译器会创建一个合成方法(我相信是包作用域)。此合成方法仅在嵌套类的 .class 文件中可见。

【讨论】:

好答案。我要补充一点,只有当内部类不是 private 时,内部类的修饰符才重要。 “当外部类访问私有成员时,编译器会创建一个合成方法”。当仅从外部类访问静态嵌套类的private static 成员时,它是否创建合成方法?假设所有静态成员(包括静态嵌套类的成员)都在编译时解析。 @andrybak Java 编译器可以识别内部私有成员何时被外部类访问,无论它是否是静态的。它仅在需要时创建合成访问器方法。 @ILMTitan 我明白,我的问题是关于在外部类中使用 仅静态 成员时是否创建合成访问器。 @ILMTitan 我使用字节码反编译器检查了我的问题。事实上,编译器确实会生成合成访问器私有静态变量。【参考方案2】:

两种嵌套类:1.静态(嵌套类)和2.非静态(也叫内部类)

现在,外部类MyList 可以访问内部类Node 的所有成员,但是当您想要限制一些外部类访问它。

有趣的阅读:Source1,Source2

【讨论】:

以上是关于Java中私有静态嵌套类中的访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章

需要解释:Java中的私有访问修饰符

Java入门系列之访问修饰符作用范围

Scala访问修饰符

在 Java 类中定义 `package private` 访问修饰符

包私有类中的`public`修饰符

14.11类的成员修饰符