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 的实例)之间的区别.但是为什么 Arrays
和 Math
,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 - 这可能只是实施者的疏忽,与所有匹配无关紧要,因此迄今为止尚未修复。
我知道最终 class(你不能继承 class)和私有构造函数(你不能创建 class 的实例)之间的区别.但是为什么 Arrays
和 Math
,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 - 这可能只是实施者的疏忽,与所有匹配无关紧要,因此迄今为止尚未修复。