为什么java.lang.Math扩展java.lang.Object?

时间:2012-10-07 02:47:58

标签: java inheritance

根据Math类的Java API,Math扩展了Object类:

public final class Math extends Object

但是,Math不会继承Object的方法,也无法构造Math对象(编辑:此语句为false,部分为false;请参阅下文)。

我的问题是为什么要这样做?如果它是一个对象,那么它应该有Object的bare-bones方法。如果它不是一个对象,那么我觉得它不应该扩展Object。

并且,假设有充分的理由扩展Object,它是如何完成的?换句话说,如何抑制继承的方法和构造函数?

数学是我脑海中最重要的一个静态定义类的例子(我想你会称之为?),但这个问题也可能适用于具有类似目的的类。

编辑:所以我知道所有类都隐式扩展了Object。令我困扰的是,对我而言,理论上的“对象”概念 - 具有状态和相关功能的东西 - 与此处所做的事情之间存在逻辑上的脱节。

4 个答案:

答案 0 :(得分:4)

对象是一切的超级类。所有类都扩展了Object

答案 1 :(得分:3)

Math 继承Object的方法。 Java中的每个类最终必须继承自Object。但是因为你无法构造Math个对象,所以没关系。这些方法是继承的,但是无法构建实例,您无法在Math中使用它们。

答案 2 :(得分:3)

每个类都隐式扩展Object,除非它们扩展另一个类(Java不允许多重继承)。

还是!通过扩展另一个类,最后扩展Object,因为最后一个不扩展另一个特定类的类扩展了Object

这个“默认继承”背后的概念可以直接从Object的JavaDoc中提取:

  

Class Object是类层次结构的根。每个班级都有   对象作为超类。所有对象,包括数组,都实现了   这类方法。

编辑: Math确实继承了Object的方法。它不会超越它们,并且调用派生到超类的实现。

你应该注意Math课程的一个重要方面。它定义的常量和方法主要是静态的。数学函数不依赖于类的特定实例,因为这些计算与上下文无关。

您没有特别的理由创建Math类的实例,这就是它的构造函数不可见的原因。您无法Math m = new Math()这就是为什么您没有看到equalshashcode等方法的原因。特别是因为类是final并且无法扩展,所以不能创建定义它们的子类。恕我直言,这将毫无意义。

答案 3 :(得分:2)

Object是每个java类的超类。你错了Math继承了对象的方法。

如果您想要更多信息,请查看来源。

http://www.docjar.com/html/api/java/lang/Math.java.html