我知道最终类(您不能继承该类)和私有构造函数(您无法创建该类的实例)之间的区别。但是为什么Arrays
和Math
,Java类都有私有构造函数,但Math
是最终类而Arrays
不是?
有什么区别?是不是两个实用程序类?
由于
答案 0 :(得分:8)
当类具有私有构造函数但不是final时,您可以在具有公共构造函数的同一类文件中定义内部类,并且可以实例化。但是您不能在该初始类文件之外定义任何子类。 例如,这将编译:
public class Animal {
public void say() {
System.out.printLn("Animal says:");
}
private Animal() {}
public static class Cat extends Animal {
public Cat() {super();}
@Override public void say() {
super.say();
System.out.printLn("Meow");
}
}
}
但是,这(在另一个文件中定义)不会:
public class Dog extends Animal {
public Dog() {super();} // compilation error here: The constructor Animal() is not visible
@Override public void say() {
super.say();
System.out.printLn("Wuf");
}
}
这种技术允许您定义类层次结构,您可以完全控制哪些类型可以扩展您的类(因为所有这些子类型都必须在同一个类文件中枚举)。
也就是说,由于上述情况,java.util.Arrays
未被定义为非最终版 - 它可能只是一个实施者的疏忽,与所有匹配无关紧要,因此迄今为止尚未确定。