由于你的问题是大约
members,我将讨论这两个领域和方法(非静态;
Anthony Accioly’s answer涉及另一个很好的用例,也包括静态字段)。
虽然在许多情况下,这只是语言语法的一个含糊不清的结果(特别是非公开课的公共领域,如您的示例代码片段),有非常好的理由需要能够在非公开课中使用公共方法,公共课
扩展到Mik378’s的答案,考虑,例如以下(设计的例子):
import ...;
class BleebleAscendingComparator implements Comparator {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
class BleebleDescendingComparator implements Comparator {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
public class BleebleView {
public enum SortMode { ASC, DESC };
public Comparator getDisplayOrderComparator (SortMode mode) {
if (mode == SortMode.ASC)
return new BleebleAscendingComparator();
else
return new BleebleDescendingComparator();
}
}
您不能在该上下文之外直接实例化那些Comparator实现,但是它们必须覆盖Comparator的公共方法,并且它们的功能可以通过Comparator接口访问。
这种相同的推理适用于例如私人或受保护的内部类。如果您无法将方法声明为public,则您无法覆盖它们继承的接口的公共方法或扩展的类。
实际示例:
>每次您在匿名内部类中覆盖公共方法(例如每次覆盖匿名ActionListener中的public void actionPerformed)时,都可以使用此方法。
>考虑您希望存储在HashMap中的任何非公开类。您将覆盖该非公共类中的public equals()和hashCode(),并且HashMap的实现可以访问它们,而不管该类是否为非公开的事实。
>经常被覆盖的public toString()是潜在非公开类的公共成员的另一个常见示例。
>一个更复杂的例子是在java.sql.DriverManager中使用java.sql.Driver(一般来说,工厂型设计大量使用这个概念) – 一个SQL驱动程序实现可能不会使实现类公开(例如,Oracle驱动程序产生非公共连接对象)。>更多…如果你留意这个例子,你会惊讶它是多么的真实!