JAVA:子类型和继承的概念是一样的吗?

Und*_*ior 5 java inheritance subtyping

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

chr*_*her 6

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

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

简而言之,让我们来看看:

class Super {
}

class Child extends Super {
}
Run Code Online (Sandbox Code Playgroud)

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

Super super = new Child();
Run Code Online (Sandbox Code Playgroud)

这是子类型,因为我们ChildSuper.所以当我说继承允许你执行子类型时,你应该看到我的意思,但它们不是同一个东西.

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

class Child extends Super implements ISomeInterface {
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以Child称为:

ISomeInterface someInterface = new Child();
Run Code Online (Sandbox Code Playgroud)

在这里,我们将它称为类型ISomeInterface,而不需要继承关系.

你的问题

ObjectsJava中的所有类都是类型的子类Object.他们暗示extends Object他们班头.这就是语言的运作方式.所以是的,每个对象都是类的子类型Object.

在Java中,只有通过使用extends关键字才能继承.

额外阅读

编辑

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


Str*_*ior 5

脚注如下:

实际上,"子类型"的概念并不完全符合"继承自":没有超级接口的接口确实是Object(第4.10.2节.类和接口类型之间的子类型)的子类型,即使它们不继承Object.

接口只能扩展其他的接口-他们没有实际extends Object,或隐或显.然而,所有Object方法都可在每个界面上使用.这使得像一个接口List<>一个亚型Object--IT具有所有的方法签名Object将有-尽管接口本身不继承实现从这些方法Object的类.