为什么Java.Lang.Math不是抽象的?

Nik*_*lic 8 java abstract-class

"abstract"关键字意味着您无法创建类的实例(对象).

Java.Lang.Math前面有以下关键字

public final class Math {
...
}
Run Code Online (Sandbox Code Playgroud)

但没有"抽象"关键字.该类只提供了一组相关的静态变量和方法,如PI和sin().

静态意味着那些变量/方法在对象的不同实例之间不能是唯一的(只有一个与类本身相关的变量/方法的副本).那么为什么甚至允许程序员创建一个类的实例呢?为什么不先用"抽象"?

Bra*_*raj 14

finalabstract关键字不能一起应用,因为final类不能被覆盖,abstract类被用于覆盖.

声明的类final不能subclassed用于创建immutableString等类

JSL部分 - 8.1.1中更好地解释了它.类修饰符

  1. abstract类是一类,它是不完整的,或者被认为是不完整的.

  2. 如果类final的定义完整且不需要或不需要子类,则可以声明该类.

以上两种说法都是相互矛盾的.


如果您想了解更多关于然后看看Java的Tutroial的策略定义为不可变对象

  1. 不要提供"setter"方法 - 修改字段引用的字段或对象的方法.
  2. 使所有字段成为最终和私有.
  3. 不允许子类重写方法.最简单的方法是声明the class as final.更复杂的方法是在中构建the constructor private和构造实例factory methods.
  4. 如果实例字段包含对可变对象的引用,则不允许更改这些对象:
    • 不要提供修改可变对象的方法.
    • 不要共享对可变对象的引用.

  • "*...因为`final`类不能被覆盖*"你可能意味着*extended*(覆盖适用于方法,而不是类). (3认同)

Gla*_*boz 12

java.lang.Math 是一个Utility类(仅包含静态实用程序方法).

定义实用程序类的正确方法是使其成为最终的,这样任何其他类都不能扩展它并拥有私有的无参数构造函数,这样就没有人可以创建该类的实例.

所以你将无法创建类的实例.但是,如果你采用抽象方法,你不能使用final,你无法阻止它被扩展.因此,前一种方法更好.


Kar*_*l S 9

如果它是抽象的,那么有人可以做到

public class NewMath extends Math {
Run Code Online (Sandbox Code Playgroud)

坦率地讲是没有意义的.

但是,您无法创建新的Math实例,因为它的唯一构造函数是私有的:

private Math() {}
Run Code Online (Sandbox Code Playgroud)