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。非常感谢。我以后会记住这一点。