5

根据此答案末尾的注释,看起来子类型和继承在 Java 中是不同的概念。它是什么?只有当类声明包含extends ...子句时才继承?如果是这种情况,那么一个类将不会从 Object 继承,即使它是它的子类型,对吗?

4

5 回答 5

6

继承是实现子类型化的一种方式。取自维基百科

在编程语言理论中,子类型(也称为子类型多态性或包含多态性)是类型多态性的一种形式,其中子类型是通过某种可替换性概念与另一个数据类型(超类型)相关的数据类型,这意味着程序元素,通常是子例程或函数,编写为对超类型的元素进行操作,也可以对子类型的元素进行操作。

简而言之,让我们看一下:

class Super {
}

class Child extends Super {
}

这是继承,因为Child继承了Super.

Super super = new Child();

这是子类型,因为我们ChildSuper. 所以当我说继承允许你执行子类型化时,你应该明白我的意思,但它们不是一回事。

例如,您可以使用接口实现子类型化:

class Child extends Super implements ISomeInterface {
}

现在我们可以这样称呼Child

ISomeInterface someInterface = new Child();

在这里,我们将其称为 type ISomeInterface,而不需要继承关系。

你的问题

Java 中的所有Objects内容都是 type 的子类Object。他们隐含extends Object他们的类头中。这只是语言的工作方式。所以是的,每个对象都是 class 的子类型Object

在 Java 中,继承只能通过使用extends关键字来实现。

额外阅读

编辑

听听 Marko Topolnik 所说的一切。他很聪明,你知道的。

于 2014-08-28T15:44:22.913 回答
5

脚注内容如下:

碰巧的是,“子类型”的概念并不完全符合“继承自”:没有超接口的接口确实是Object第 4.10.2 节。类和接口类型之间的子类型)的子类型,即使它们不继承自Object

接口只能扩展其他接口——它们实际上都没有extends Object无论是显式的还是隐式的。然而,所有Object方法在每个接口上都可用。这使得接口像List<>一个子类型——它具有所有的Object方法签名Object——即使接口本身没有从类继承这些方法的实现Object

于 2014-08-28T15:47:15.323 回答
3

继承和子类型是两个独立的概念。一个类型只能从它的父类型继承;因此继承与子类型关系相关。然而,反过来并不成立:子类型不一定从其父类继承任何东西。语言规则准确地规定了子类型所继承的内容。

在 Java 的示例中,私有成员不会被继承。在 Java 8 中,接口可以声明静态方法,但它们的子类型不继承这些成员。

于 2014-08-28T16:31:47.720 回答
1

继承是显式的,子类型是隐式的。

一切(除了原始类型)都是对象的子类型。如果您显式使用extends关键字,那么您正在使用继承。

另请参阅:继承不是子类型化

于 2014-08-28T15:42:28.490 回答
1

子类型是指接口的兼容性。如果可以在 A 类型的对象上调用的每个函数也可以在 B 类型的对象上调用,则 B 类型是 A 的子类型。

继承是指实现的重用。如果 B 的某些函数是根据 A 的函数编写的,则类型 B 继承自另一个类型 A。

通常,子类可以使用其超类中的每个方法,继承不需要这个

来源:这里

于 2014-08-28T15:43:59.937 回答