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

Java-Final class vs private constructor: Difference between java.util.Arrays and java.lang.Math

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

有什么区别?两者都不实用 classes?

谢谢

当 class 有私有构造函数但不是最终构造函数时,您可以在同一个 class 文件中定义具有 public 构造函数的内部 classes实例化。但是您不能在初始 class 文件之外定义任何子 classes。 例如,这将编译:

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");
  }
}

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

就是说,由于上述原因,java.util.Arrays 未定义为 non-final - 这可能只是实施者的疏忽,与所有匹配无关紧要,因此迄今为止尚未修复。