Java类型与实例类型

Java类型与实例类型,java,Java,当我做以下事情时: List<Integer> myList = new LinkedList<>(); List myList=newlinkedlist(); 对象是否为列表类型的“myList”?我对正确的定义更感兴趣。这样说是否正确: myLyst的类型为List,但其实例的类型为LinkedList 这对我来说没有意义,因为对象只能是一种类型。因此,最好说它是LinkedList类型,但仅限于接口列表?类实现了列表接口myList是LinkedList类的一

当我做以下事情时:

List<Integer> myList = new LinkedList<>();
List myList=newlinkedlist();
对象是否为列表类型的“myList”?我对正确的定义更感兴趣。这样说是否正确:

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


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

类实现了
列表
接口
myList
LinkedList
类的一个实例,因此属于
LinkedList
类型

由于接口不是类型,
myList
不是类型
List
,正如接口
List
不是类型一样


我希望这个答案能澄清一些问题?

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

但是
LinkedList
作为一种类型,是
List
的一个子类型,因此说
myList
是一种
列表也是正确的

在运行时可以确定的是,一个对象只有一个运行时类,在本例中是
LinkedList
。可以通过调用
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

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

这显然是因为LinkedList实现了List


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

Java List是一个扩展集合接口的接口

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

myList是一个变量,可以包含任何List实现的实例。它当前持有一个具体类型LinkedList的实例,该实例实现了List接口。关键区别在于myList只是对对象的引用。它本身不是一个物体。将变量视为鞋盒,将实例视为它包含的鞋子。这个盒子可能可以放不同款式的鞋子,但鞋子本身仍然是一种特殊类型的鞋子:高跟鞋、运动鞋等等。如果你想的话,你可以把鞋子拿出来,换成另一双完全不同的鞋子,但是说这个盒子只适合高跟鞋是没有意义的,因为这就是目前存在的东西你要找的对比词是声明类型,它总是实例类型的超类型。我不得不恭敬地不同意这个答案<代码>列表
链接列表
一样是一种类型,即类型系统将变量声明为类型
列表
<代码>列表
不是一个类,但我认为它是一个类型。@SilvioMayolo按照您的思路,所有接口都会被视为“类型”吗?只是想知道,当然。我认为Java中的每个基本类型、枚举、类和接口都是type.OK。非常感谢。我以后会记住这一点。