繁体   English   中英

Java-类型与实例类型

[英]Java - Type vs instance type

当我做类似的事情时:

List<Integer> myList = new LinkedList<>();

对象类型为List的“ myList”吗? 我对正确的定义更感兴趣。 这样说是否正确:

myLyst的类型为List,但其实例的类型为LinkedList?

这对我来说没有意义,因为对象只能是一种类型。 因此,也许最好说它是LinkedList类型,但仅限于接口List?

myList有一个具体的运行时类,即LinkedList

但是LinkedList作为类型,是List的子类型,因此说myList List也是正确的。

在运行时确定的是,一个对象只有一个运行时类,在本例中为LinkedList 可以通过调用myList.getClass()来读取myList.getClass()

但是检查类型层次结构,即对象是否是给定类型的实例(类或接口),并不要求要检查其类型的是类。 所以:

myList instanceof LinkedList //true
myList instanceof List //true
myList instanceof Collection //true
myList instanceof ArrayList //false, 
  //because it's not an instance of ArrayList, 
  //and LinkedList is not a subtype of ArrayList

LinkedList类实现List接口。 myListLinkedList类的实例,因此是LinkedList类型。

由于接口不是类型,因此myList的类型myListList ,因为List的接口不是类型。

我希望这个答案可以使事情变得清晰起来吗?

我会说变量的静态类型是List,而其运行时类型是LinkedList。

LinkedList实现List的事实显然使得这成为可能。

在讨论重写(继承和虚拟调用)和重载(具有不同参数的不同方法-参数仅考虑静态类型)时,区别非常重要。

Java List是扩展Collection接口的接口。 图片显示了层次结构

现在,正确的方法是,说“ myList”是当前保存LinkedList类实例的接口变量。 您也可以从另一个类比中看它,接口只是一个抽象表示,因此我们永远无法创建类型为List的对象,因此它只能用于保存实现它的类的对象的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM