up,楼主贴子有点好,
new Collection[0] instanceof Collection,你这句话是不是说collection不是Collection[0]的“顶端”,没有一个共同的端点,所以不通过
new Collection[0] instanceof Collection,你这句话是不是说collection不是Collection[0]的“顶端”,没有一个共同的端点,所以不通过
解决方案 »
- kds厨房单显示的一个界面,求思路,不管是做WEB开发还是java桌面应用程序开发的都请帮我想个思路。谢谢!
- StringBuffer数据输出成txt文本
- 一个很奇怪的错误
- 新手请教数组问题~!!
- 关于ALT+F4清除窗口后,再次点击报错的问题
- oracle数据库建表缺失关键字 高手帮我看看
- 怎么实现与远程的网页同步!
- 英文不是很好,为了考SCJP,好多地方看英文书,概念什么的比较模糊,哪有详细的中文的Java语言教程呀?最好和SCJP想符合的,别告诉我《Think in Java》呀!那本书我烦透了!
- 我是java初学者,请各位推荐好书几本。谢谢啦。目标:java专家。
- idltojava问题
- !!!紧急求助,一个关于java的程序
- 接口与类多对一的关系,如何解决和应用!?!??
我的表述意思是Collection[] 和 Collection完全是两个不同的类,之间没有继承关系。
Object是所有类的根,即所有对象都是从属于Object,包括数组(数组也可以看作是一个对象,尽管是多个对象的聚合),Object从某种意义上说就是任意类型,相当于C或VB或delphi的variant类型(可变类型,即该类型可以转换为任意一种类型,比如int或char等等),所以,也可以这样来看这个问题:
Object obj;
obj = new Object[2]; //这样是没问题的,obj相当于是可变类型(该对象可以变为任意需要的对象)
而以下的
Collection col;
col = new Collection[2]; //这样是不行的,因为col是具体指定的类型Collection,是不可变的Object可以派生出Object[],所以
Object<--Object[]
而Collection不能派生出Collection[],所以
Collection<-\-Collection[]这样的对应关系应该是不合理的
Object[]<--Collection[]<--HashSet[]
| | |
V V V
Object<--Collection<--HashSet应该是
Object[]<--Collection[]<--HashSet[]
\ | /
\ | /
\ | /
Object<--Collection<--HashSet
new Object[]{} instanceof Object
可以分成两步来理解,首先是 new Object[]{} ,创建一个Object数组,其中的每一个元素都可以是一个Java对象,根据Java的多态,Object类是Java的根类,所以任何对象都可以放到这个数组中
其次,在Java中数组本身也是一个对象,因此它也是Object类的对象,这样 instanceof Object 就返回 true 了
我觉得你关于可变的概念是错误的。Object引用可以指向任何对象并不是因为Object“可变”--也就是你说的“相当于C或VB或delphi的variant”,而是因为一切对象皆继承自Object,根据java的多态性Object引用可以指向任何对象。所以,你认为Collection引用“不可变”是错误的。因为Collection c=new HashSet()成立,照你这么说Collection引用又变成“可变”的咯?事实上在java中“可变”是另一个概念,和本贴讨论的问题无关。to jimshen(jimshen)
你没有指出我错在哪里。to liusoft(凤梨罐头)
基本类型就是基本类型,基本类型不extends Object,因为基本类型不是对象。不果基本类型的包装类继承自Object。
我只是说可以这样去看这个问题,而且我的例子也提到了这种“可变”是一种派生关系Collection c=new HashSet()成立,照你这么说Collection引用又变成“可变”的咯?
在这种场合可以说Collection可变,因为Collection可以派生出HashSet,但Collection的可变毕竟是有局限的,只能“变为”实现过该接口的类(即由其派生出来的类),从这里可以看出,任何父类(包括接口)都“可变”(实例化)为子类,而Object是所有类的根,所以任何对象都是Oject的实例,除此之外,除非符合继承(或接口)实现关系,否则是未必就是满足instanceof,所以
Object[]<--Collection[]<--HashSet[]
| | |
V V V
Object<--Collection<--HashSet
这个本来就不存在一一对应的关系。我之所以联想到Object和variant,是因为Object是所有类的根,可以实例化为任何子类,这和variant可以变成各种类型有点相似,其他语言里有且只有variant(当然C++的CObject暂不讨论)可变类型,而java里有且只有Object可派生出所有类
我说过你的概念是错的。到现在为止你的概念还是错的。
java中引用没有可变这一说法,只有多态。一个引用,它的引用类型在声明的时候就定下来了,永远也不会再变。至于Object可以作为任何对象的引用、Collection可以作为HashSet的引用,那是因为多态的关系。再强调一下“可变”和“多态”完全是两码事。你所说的“可变”,在其他语言中确实有。比如说javaScript中的Var。但是Var之所以可以指向任何对象,那是因为javaScript是一种弱类型检查的语言,引用不要求与类型绑定。而java是一种强类型检查的语言,引用要求与类型绑定。所以,把“可变”这个概念用于java引用是完全错误的。更何况,在java中,“可变”有它另外的含义。
我承认我的这种“借用”其他语言的概念来说明问题是有点欠妥,但我的本意只是想解释得通俗一些,instanceof是用于判断一个对象(数组)是否是一个类(数组)的实例,且instanceof是会不断向上追溯根源的,当追溯到对象的祖宗类与判断的类一致时将返回true,很显然,java里所有类都继承于Object,任何对象不断向上追溯最终必将到达根类Object,所以xxx instanceof Object返回都是true是可以理解的,而new Collection[0] instanceof Collection 这个之所以不合法是因为instanceof的前后必须是对等的,即前者是对象数组,后者必须是类数组(Object除外,因为数组也是对象),而
Collection [] a=new Collection[1];
HashSet [] b=new HashSet[1];
System.out.println(b instanceof Collection[]);这个之所以返回true是因为HashSet[]和Collection[]是符合类的派生关系,即Collection[]可以派生HashSet[],所以HashSet[]的实例也是Collection[]的实例,而如果改为String[] b=new String[1];很显然b instanceof Collection[]将返回false,因为Collection[]是不能派生出String[],而如果b instanceof Object[]又返回true,由于Object是所有类的根,所以Object[]也是所有对象数组的根,正如楼主说的
Object[]<--Collection[]<--HashSet[]Object<--Collection<--HashSet
两个继承体系是并行的,而由于数组也是对象,所以Object[]也继承于Object,也就是
Object[]<--Collection[]<--HashSet[]
|
V
Object<--Collection<--HashSet
当调用instanceof方法时,将沿着相应的派生关系路径查找,无论是从类路径还是类数组路径查找,最终都会找到Object。之前借用其他语言的“可变”概念来说明是不合理的,java里“可变”的概念我好像没看到过,希望alienbat (亡灵法师) 能在这里也做个说明。
其实唯一有点搞头的地方是A extends B的时候,A[] Vs B[],A[][] vs B[][]以及
A[] vs B[][]还有A[][] vs B[]的关系,搞清楚这个你就彻底明白java数组的概念
--------------------------------------------------------------
你错了。这里之所以不合法是因为Collection[0]类与Collection类不存在任何继承关系,而不是什么“对等”。两个类之间是否存在继承关系是在编译期就确定下来的东西,所以这个错误是个编译错误。此处有必要说一下instanceof操作符。instanceof操作符用于确定一个类的运行期类型,注意了是运行期--也就是说,HashSet instanceof Collection返回true,是在运行期决定的。但是instanceof语句能够通过编译的前提是两端的类有继承关系,而有否继承关系是在编译期决定的。----------------------
...所以HashSet[]的实例也是Collection[]的实例,而如果改为String[] b=new String[1];很显然b instanceof Collection[]将返回false,因为Collection[]是不能派生出String[],
-----------------------
b instanceof Collection[]不会在运行时返回false,而会在编译时报错。因为String[]和Collection[]没有继承关系。你对数组继承树的概念是正确的。其他某些概念则有错误。
在java中“可变”指的是一个对象在建立后数据可否改变。
怎么java版的人技术那么差。都4个三角了连基础概念都没弄清楚。怎么搞的...
另qybao(阿宝) 怎么讲楼主的图给改了?本来是
Object[]<--Collection[]<--HashSet[]
|
V
Object<--Collection<--HashSet怎么变成这样了
Object[]<--Collection[]<--HashSet[]
| | |
V V V
Object<--Collection<--HashSet
而且我还觉得qybao(阿宝) 的表达有问题:
Object[]<--Collection[]<--HashSet[]
\ | /
\ | /
\ | /
Object<--Collection<--HashSet
其实Collection[],HashSet[]并不是直接从Object上继承而来的啊,应该是楼主说的那样才对
Collection[i] instanceof Object成true了
>Collection[i] instanceof Object成true了原文>Collection[i] instanceof Collection就成true了有什么问题?
----------------------------------谁告诉你的??
谁说引用不可变。JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的
首先,我说的是“引用类型在声明的时候就定下来了,永远也不会再变”。请你看清楚类型二字。
其次,看到“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这句话,我本想说你没有搞清楚引用和对象本身的区别;但是这句话含混不清,所以我也不能这么说。请说明这句话的出处,或者还是你自己想出来的?
-----------------------to shine333(enihs)
我真想不通来,你都两颗星了,为何如此基本的概念还搞错?而且还以非常确定的口吻说出完全错误的结论,真令人惊讶。----new Collection[i] instanceof Collection当然是false, (new Collection[10])[0] instanceof Collection当然true,除非null你随便拿个编译器试试看吧。new Collection[i] instanceof Collection这句话根本就通不过编译。对此我的解释就在顶上。
另外对你说的请我思考一下“任何数组的实例XXX[] a, 都满足a instaceof Object[]?”的问题,我的回答是我发帖的时候就思考过了并已做出阐述,答案是Yes。可以得出结论,同维的对象数组符合它们单体的继承树。我是不是该结贴了?来回帖的人的说法一个比一个错误。JAVA版的整体水平真令我失望。
----------------------------------------你已经说了
我像在听笑话。
刚才的确没看清你说的是‘类型’。
凡是对对象模型有过研究的人都知道“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”。另外,水平的高低与星星多少无关,
就像你5个三角也不过如斯
Upcasting直接就改称(Object),而且,想了半天好像只有转型成Object,他们才会成为直系亲属
不管你upcast还是downcast都是没有办法改变instanceof取得的值的。instanceof检测的是对象的实际类型,而不是它的引用的类型。to qazxsw1982103(c++) -----凡是对对象模型有过研究的人都知道“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。首先告诉你一点,常识是:不同的编程语言对对象模型的实现是可以不同的。所以“研究过对象模型”并不等于“对对象模型有过研究的人”就了解java的多态。其次,不知道你有没有看过《深入java虚拟机》这本书。不好意思我看过,而其中并没有“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这种说法。你在看笑话么?我倒觉得你像个笑话。菜鸟也许认为上面这句话很高深,但我认为是狗屁。最后,三角和星星的数量在概率上能够代表一个人的技术水平。至少在你和我身上已经验证了。
------------------------------
有你就有希望常识是:不同的编程语言对对象模型的实现是可以不同的
-------------------------------
谢谢你告诉我哈 :D
敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。
----------------------------------
谁敢吓唬你?知道你是大学毕业,果然了得《深入java虚拟机》
-----------------------
没,只看过《inside the java virtual machine》别激动,真的没打算和你争什么。有那时间不如拉个屎
>不管你upcast还是downcast都是没有办法改变instanceof取得的值的。instanceof检测的是>对象的实际类型,而不是它的引用的类型。所以我说“实际类型”为Collection[]的某个实例 instanceof Collection类型是永远错误的另外,针对你的>另外对你说的请我思考一下“任何数组的实例XXX[] a, 都满足a instaceof Object[]?”的问题,我的回答是我发帖的时候就思考过了并已做出阐述,答案是Yes。可以得出结论,同维的对象数组符合它们单体的继承树。你有没有,明确回答,有没有,尝试过Object a = new double[10];
System.out.println(a instanceof Object[]);而且,如果一定要咬文嚼字的话,我问问题的时候可从来没有说过对象数组,这个条件可是你自己附加的>请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。
>最后,三角和星星的数量在概率上能够代表一个人的技术水平。至少在你和我身上已经验证了。
我说过了
>还有,星星三角并不代表什么,>闻道有先后,术业有专攻,如是而已不要仗着自己比人家多了那么4000-多分就瞧不起人家。分数高的人也会有求于分数低的人的时候。我在楼上还犯了编译期错误那么低级的错误。>请你不要对我说“研究、对象模型”这样的大词。敢问你哪个大学毕业的?拿名词来吓唬我,你是找错人了。敢问阁下师从何处?>其次,不知道你有没有看过《深入java虚拟机》这本书。不好意思我看过,而其中并没有“JAVA的底层就是利用改变引用的涵盖地址来实现“多态”的”这种说法。你在看笑话么?我倒觉得你像个笑话。菜鸟也许认为上面这句话很高深,但我认为是狗屁。真有本事你看书干嘛呢?你有没有作为那次运算的某个电子参与其中?要知道,毛 主席他老人家教导我们.......好了玩笑开够了,也有点过分了,回到正题,我跑到这里,只想指出这么几点:
1 null 在编译期可以代表任何对象类型,但在运行期却什么也不是
2 任何一个数组,其类型都不是组成这个数组元素的类型或者元素的子类型,当然Object除外
3 原生类型的数组,是Object的子类型,却不是Object[]的子类型如果这3点中有差错,请马上发短消息给我,或者[email protected],无论是谁,只要能够指出,立马高分相赠,绝对从心底表示感激
oxv(花生壳)
我的表述意思是Collection[] 和 Collection完全是两个不同的类,之间没有继承关系。
我不是什么电子,没直接参与过运算。不过我本专业倒是有数字电路、汇编和单片机,所以本人对计算机还是比较了解深入的。恩,切入正题。你总结的三条东西是对的。Collection[][] 是Object[][]->Object[]->Objectdouble[][]是Object[]->Object我验证了一下,这也是对的。不过,Object[][]->Object[]->Object我倒是真的没有想到过。我在本书上看到过,说同维对象数组可以有继承关系。另外,原生数组我也没有仔细考虑过。我把数组和Collection容器类比的太多了,其实数组和Collection还是有很大区别的。
shine333(enihs).感谢你的认真。真理越辩越明。to qazxsw1982103(c++)拉屎去厕所,别来这里。祝你拉屎愉快。