根据此答案末尾的注释,看起来子类型和继承在 Java 中是不同的概念。它是什么?只有当类声明包含extends ...
子句时才继承?如果是这种情况,那么一个类将不会从 Object 继承,即使它是它的子类型,对吗?
5 回答
继承是实现子类型化的一种方式。取自维基百科:
在编程语言理论中,子类型(也称为子类型多态性或包含多态性)是类型多态性的一种形式,其中子类型是通过某种可替换性概念与另一个数据类型(超类型)相关的数据类型,这意味着程序元素,通常是子例程或函数,编写为对超类型的元素进行操作,也可以对子类型的元素进行操作。
简而言之,让我们看一下:
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();
在这里,我们将其称为 type ISomeInterface
,而不需要继承关系。
你的问题
Java 中的所有Objects
内容都是 type 的子类Object
。他们隐含在extends Object
他们的类头中。这只是语言的工作方式。所以是的,每个对象都是 class 的子类型Object
。
在 Java 中,继承只能通过使用extends
关键字来实现。
额外阅读
Liskov 替换原则是一种设计原则,主要关注子类型化的思想
Java 类之间的不同关系。这将帮助您更深入地了解 OOP。
编辑
听听 Marko Topolnik 所说的一切。他很聪明,你知道的。
脚注内容如下:
碰巧的是,“子类型”的概念并不完全符合“继承自”:没有超接口的接口确实是
Object
(第 4.10.2 节。类和接口类型之间的子类型)的子类型,即使它们不继承自Object
。
接口只能扩展其他接口——它们实际上都没有extends Object
,无论是显式的还是隐式的。然而,所有Object
方法在每个接口上都可用。这使得接口像List<>
一个子类型——它具有所有的Object
方法签名Object
——即使接口本身没有从类继承这些方法的实现Object
。
继承和子类型是两个独立的概念。一个类型只能从它的父类型继承;因此继承与子类型关系相关。然而,反过来并不成立:子类型不一定从其父类继承任何东西。语言规则准确地规定了子类型所继承的内容。
在 Java 的示例中,私有成员不会被继承。在 Java 8 中,接口可以声明静态方法,但它们的子类型不继承这些成员。
子类型是指接口的兼容性。如果可以在 A 类型的对象上调用的每个函数也可以在 B 类型的对象上调用,则 B 类型是 A 的子类型。
继承是指实现的重用。如果 B 的某些函数是根据 A 的函数编写的,则类型 B 继承自另一个类型 A。
通常,子类可以使用其超类中的每个方法,继承不需要这个
来源:这里