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

时间:2017-01-27 12:20:52

标签: java constructor private final

我知道最终类(您不能继承该类)和私有构造函数(您无法创建该类的实例)之间的区别。但是为什么ArraysMath,Java类都有私有构造函数,但Math是最终类而Arrays不是?

有什么区别?是不是两个实用程序类?

由于

1 个答案:

答案 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未被定义为非最终版 - 它可能只是一个实施者的疏忽,与所有匹配无关紧要,因此迄今为止尚未确定。