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

时间:2014-07-22 19:47:09

标签: java abstract-class

"摘要" keyword是指您无法创建类的实例(对象)。

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

public final class Math {
...
}

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

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

之前

5 个答案:

答案 0 :(得分:14)

finalabstract个关键字无法一起应用,因为final类无法覆盖,abstract类可用于覆盖。< / p>

  

声明为final的类不能是用于创建immutable类的subclassed,如String

JSL section - 8.1.1. Class Modifiers

下进行了更好的解释
  1. abstract类是一个不完整或被认为不完整的类。

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

  3. 上述两个陈述都自相矛盾


    如果您想了解更多信息,请查看A Strategy for Defining Immutable Objects上的 Java Tutroial

    1. 不要提供&#34; setter&#34; methods - 修改字段引用的字段或对象的方法。
    2. 将所有字段设为最终字段并保密。
    3. 不允许子类覆盖方法。最简单的方法是声明the class as final。更复杂的方法是制作the constructor private并在factory methods中构建实例。
    4. 如果实例字段包含对可变对象的引用,则不允许更改这些对象:
      • 不要提供修改可变对象的方法。
      • 不要共享对可变对象的引用。

答案 1 :(得分:12)

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

定义实用程序类的正确方法是使其成为 final ,这样任何其他类都不能扩展它并拥有 private no-args构造函数,这样任何人都无法创建一个类的实例。

所以你将无法创建类的实例。但是,如果您使用抽象方法,则无法使用最终,并且无法阻止其被扩展。因此,前一种方法更好。

答案 2 :(得分:9)

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

public class NewMath extends Math {
坦率地讲是没有道理的。

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

private Math() {}

答案 3 :(得分:2)

final表示你无法扩展它,你无法创建实例的原因是因为构造函数是私有的。这是(在java中)定义静态类或工厂类的方法。

答案 4 :(得分:0)

Abstract关键字表示该类不能是Instantiable,但可以是Extended。 对于实用类这样的数学类,扩展它没有任何意义。声明no-args构造函数使其成为非可实例化的,并且最终使其成为非可扩展的......所以它是完美匹配....如果你使用Abstract,那么你就不能使用Final ......