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

时间:2014-08-28 15:35:46

标签: java inheritance subtyping

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

5 个答案:

答案 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关键字才能继承。

额外阅读

修改

听取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)

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

所有内容(基本类型除外)都是对象的子类型。如果您明确使用extends关键字,那么您正在使用继承。

另请参阅:Inheritance is not subtyping

答案 4 :(得分:1)

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

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

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

来源:here