【问题标题】:Access modifiers inside a private static nested class in JavaJava中私有静态嵌套类中的访问修饰符
【发布时间】: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(){}
    }
}

【问题讨论】:

  • 你能发布你的代码以及你的假设吗

标签: java class methods static access-modifiers


【解决方案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 的所有成员,但是当您想要限制一些外部类访问它。

有趣的阅读:Source1Source2

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2021-08-25
    • 2015-11-26
    • 2014-08-27
    • 2018-02-13
    • 2017-12-22
    • 2010-10-29
    • 2023-04-07
    相关资源
    最近更新 更多