根据Math类的Java API,Math扩展了Object类:
public final class Math extends Object
但是,Math不会继承Object的方法,也无法构造Math对象(编辑:此语句为false,部分为false;请参阅下文)。
我的问题是为什么要这样做?如果它是一个对象,那么它应该有Object的bare-bones方法。如果它不是一个对象,那么我觉得它不应该扩展Object。
并且,假设有充分的理由扩展Object,它是如何完成的?换句话说,如何抑制继承的方法和构造函数?
数学是我脑海中最重要的一个静态定义类的例子(我想你会称之为?),但这个问题也可能适用于具有类似目的的类。
编辑:所以我知道所有类都隐式扩展了Object。令我困扰的是,对我而言,理论上的“对象”概念 - 具有状态和相关功能的东西 - 与此处所做的事情之间存在逻辑上的脱节。
答案 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()
这就是为什么您没有看到equals
或hashcode
等方法的原因。特别是因为类是final并且无法扩展,所以不能创建定义它们的子类。恕我直言,这将毫无意义。
答案 3 :(得分:2)
Object
是每个java类的超类。你错了Math
继承了对象的方法。
如果您想要更多信息,请查看来源。