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)。
同样的推理也适用于例如 private
或 protected
内部类。如果您无法声明方法 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/