基于this answer末尾的注释,看起来子类型和继承是Java中略有不同的概念。它是什么?仅当类声明包含extends ...
子句时才是继承吗?如果是这种情况,那么一个类不会从Object继承,即使它是它的子类型,对吧?
答案 0 :(得分:6)
继承是实现子类型的一种方式。取自Wikipedia:
在编程语言理论中,子类型(也是子类型多态或包含多态)是一种类型多态,其中子类型是一种数据类型,通过某种可替代性概念与另一种数据类型(超类型)相关,这意味着程序元素,通常用于操作超类型元素的子程序或函数,也可以对子类型的元素进行操作。
简而言之,让我们来看看:
class Super {
}
class Child extends Super {
}
这是继承,因为Child
继承了Super
。
Super super = new Child();
这是子类型,因为我们将称为Child
作为Super
。所以当我说继承允许你执行子类型时,你应该看到我的意思,但它们不是一回事。
例如,您可以使用接口实现子类型化:
class Child extends Super implements ISomeInterface {
}
现在我们可以将Child
称为:
ISomeInterface someInterface = new Child();
在这里,我们将其称为类型ISomeInterface
,而不需要继承关系。
您的问题
Java中的所有Objects
都是Object
类型的子类。他们隐式地在他们的类标题中有extends Object
。这只是语言运作的方式。所以是的,每个对象都是类Object
的子类型。
在Java中,只有使用extends
关键字才能继承。
额外阅读
Liskov Substitution Principle是一个设计原则,主要关注子类型的概念
The different relationships。这将有助于您更深入地了解OOP。
修改强>
听取Marko Topolnik所说的一切。你知道他很聪明。
答案 1 :(得分:5)
脚注上写着:
实际上,“subtype”的概念并不完全符合“继承自”:没有超级接口的接口确实是{{1}的子类型} {(§ 4.10.2. Subtyping among Class and Interface Types )即使他们没有继承
Object
。
接口只能扩展其他接口 - 实际上没有Object
,显式或隐式。然而,所有extends Object
方法都可用于每个接口。这使Object
的接口像List<>
的子类型 - 它具有Object
所具有的所有方法签名 - 即使接口本身不具有从Object
类继承这些方法的实现。
答案 2 :(得分:3)
继承和子类型是两个独立的概念。类型只能从其父类型继承;因此,继承与子类型关系相关联。但是,反向不成立:子类型不一定从其父类继承任何内容。语言规则确切地规定了子类型继承的内容。
在Java的例子中,不会继承私有成员。在Java 8中,接口可以声明静态方法,但它们的子类型不会继承这些成员。
答案 3 :(得分:1)
答案 4 :(得分:1)
子类型是指接口的兼容性。如果可以在类型B的对象上调用可以在类型A的对象上调用的每个函数,则类型B是A的子类型。
继承是指重用实现。如果B的某些函数是根据A的函数编写的,则类型B继承自另一个类型A.
通常,子类可以使用其超类中的每个方法,继承不需要这个
来源:here