Java-Final类vs私有构造函数:java.util.Arrays和java.lang.Math之间的区别

Ant*_*996 11 java constructor final private

我知道final类(你不能继承类)和私有构造函数(你不能创建类的实例)之间的区别.但是为什么ArraysMathJava类都有私有构造函数但是Math是最终类而Arrays不是?

有什么不同?不是两个实用类?

谢谢

M. *_*rov 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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,这(在另一个文件中定义)不会:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

此技术允许您定义类层次结构,您可以完全控制哪些类型可以扩展您的类(因为所有这些子类型必须在同一个类文件中枚举).

也就是说,java.util.Arrays由于上述原因,未被定义为非最终版 - 它可能只是一个实施者的疏忽,并不重要,所以它迄今尚未修复.