-2

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

public final class Math extends Object

但是,Math 不继承 Object 的方法,并且您也不能构造 Math 对象(编辑:此语句是错误的,部分是错误的;见下文)。

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

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

数学是我心目中这种静态定义类最重要的例子(我猜你会这么称呼它?),但这个问题也可能适用于具有类似目的的类。

编辑:所以我知道所有类都隐式扩展 Object. 困扰我的是,对我来说,理论上“对象”的概念——具有状态和相关功能的东西——与这里正在做的事情之间存在逻辑脱节。

4

4 回答 4

4

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

于 2012-10-07T02:49:24.860 回答
3

Math 确实继承了Object的方法。Java 中的每个类最终都必须继承自Object. 但既然你不能构造Math对象,那也没关系。这些方法是继承的,但无法构造实例,您永远无法从Math.

于 2012-10-07T02:49:56.623 回答
3

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

仍然!通过扩展另一个类,你最终会扩展Object,因为最后一个不扩展另一个特定类的类扩展了Object

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

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

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

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

您没有特别的理由来创建 Math 类的实例,这就是它的构造函数不可见的原因。您不能这样做Math m = new Math(),这就是为什么您看不到诸如equalsor之类的方法的原因hashcode。特别是由于该类是最终类且无法扩展,因此您无法创建定义它们的子类。恕我直言,这毫无意义。

于 2012-10-07T02:54:30.860 回答
2

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

如果您想了解更多信息,请查看源代码。

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

于 2012-10-07T02:51:41.497 回答