java - 为什么我可以在非公共(public)类(class)中拥有公共(public)成员?

标签 java class public-members

class MyClass 
{
    public static final int num=90;
}
  • 为什么允许我在非公共(public)类中创建公共(public)成员?
  • 是否有其他我不知道的访问该成员的方法(除了通过类名)?

最佳答案

因为您的问题是关于 members ,我将讨论字段和方法(非静态;Anthony Accioly's answer 涉及另一个很好的用例,其中也包括静态字段)。

虽然在许多情况下,这只是语言语法的模棱两可的结果(特别是:非公共(public)类中的公共(public) fields,如您的示例片段中所示),但有很好的理由需要能够在非公共(public)类中使用公共(public)方法

Mik378's 上展开回答,考虑,例如,以下(人为的例子):

import ...;

class BleebleAscendingComparator implements Comparator<Bleeble> {
    @Override public int compare (Bleeble o1, Bleeble o2) { ... }
}

class BleebleDescendingComparator implements Comparator<Bleeble> {
    @Override public int compare (Bleeble o1, Bleeble o2) { ... }
}

public class BleebleView {  
    public enum SortMode { ASC, DESC };
    public Comparator<Bleeble> getDisplayOrderComparator (SortMode mode) {
        if (mode == SortMode.ASC)
            return new BleebleAscendingComparator();
        else
            return new BleebleDescendingComparator();
    }
}

您不能直接在该上下文之外实例化这些 Comparator 实现之一,但它们必须覆盖 Comparator 的公共(public)方法,并且它们的功能可以通过 访问比较器接口(interface)。

同样的推理也适用于例如 privateprotected 内部类。如果您无法声明方法 public,您将无法覆盖它们继承的接口(interface)或它们扩展的类的 public 方法。

实际例子:

  • 您每次在匿名内部类中重写公共(public)方法时(例如,每次在匿名 中重写 public void actionPerformed ActionListener)。

  • 考虑您希望存储在 HashMap 中的任何非公共(public)类。您将覆盖该非公共(public)类中的公共(public) equals()hashCode() ,并且 HashMap 的实现可以访问它们而不管该类是非公开的。

  • 经常被覆盖的 public toString() 是潜在非公共(public)类的公共(public)成员的另一个常见示例。

  • 一个更复杂的例子是在 java.sql.DriverManager 中使用 java.sql.Driver (一般来说,工厂类型的设计会大量使用这个概念)——SQL 驱动程序实现可能不会公开实现类(例如 Oracle 驱动程序产生非公共(public) Connection 对象)。

  • 还有更多...如果您留意这方面的例子,您会惊讶于它的普遍性!

关于java - 为什么我可以在非公共(public)类(class)中拥有公共(public)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135640/

相关文章:

java - 中介对象如何工作?它背后的想法是什么?

java - Android - Firebase 访问级别

jQuery 下拉问题

c++ - 当 Injected-Class-Name 发生时会发生什么? (C++)

java - 在 Java 中创建通用 Iostream 类

java - Freemarker:在模板中没有 getter 的情况下访问公共(public)字段

php - 在 PHP 中延迟加载公共(public)类数据成员

java - 最好的方法是将jsvc与您的java服务打包为源代码,然后让使用它的人在使用前进行编译?

java - 无法使用Java DatagramSocket捕获UDP广播包