亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

請問為什么從ArrayList集合中取出來的對象不能直接調用它的屬性?

Course?cr1?=new?Course("1","1函數");
		coursesToSelect.add(cr1);
		//這樣是可以的
		Course?s=?(Course)coursesToSelect.get(0);
		System.out.println(s.name);
		//這樣是不行的,為什么?
		System.out.println(coursesToSelect.get(0).name);
		


正在回答

2 回答

因為往集合里面添加或者取出類型的時候,無論之前是什么類型,都會變成Object類型,所以取出的時候也是Object類型,課程的名字是Course類型的,所以我們要把Object類型強轉為Course類型,才能取得課程的名稱

1 回復 有任何疑惑可以回復我~
#1

風蕭瑟 提問者

System.out.println((Course)coursesToSelect.get(0).name); 那這樣算不算強轉為了Course類型?
2015-12-26 回復 有任何疑惑可以回復我~
#2

風蕭瑟 提問者

非常感謝!
2016-01-07 回復 有任何疑惑可以回復我~

在文本編輯的時候是不能判斷出類型轉換是否能真正的轉換成功,只能說明這個語法沒有什么問題,是通過某些文件完成的靜態分析。如果轉換不成功,最終會報錯。
//這樣是可以的
??????? Course s= (Course)coursesToSelect.get(0);
??????? System.out.println(s.name);
因為類型轉換已經從語法上通過了,s被認為是Course類對象,不管他實際上是不是,因為你聲明s為Course類對象,如果強制轉換錯誤,右邊的才是原罪,s本身是沒有錯的。Course類對象可以調用name域。
比如:????????? ListTest lt=new ListTest();
??????????????? Object obj=new Object();
?? ??? ?lt=(ListTest)obj;
語法上沒有問題,但是運行時會報錯。

//這樣是不行的,為什么?
??????? System.out.println((Course)coursesToSelect.get(0).name);
我覺得有2種可能,我自己也不太明白:要么是因為靜態分析是靠某些文件完成的,可能完成不了這種分析,畢竟這里的"."那么多,到底cast誰,要么是承認你的語法沒有問題,但是不真正認為這個強制轉換是成功的,不把(Courses)coursesToSelect.get(0)作為Course類對象,因此不允許調用name。前面成功是因為你是先聲明了一個Course類對象變量s,注意,是聲明了,所以可以調用name,至于成功與否,還要根據運行時,s是不是真的是一個Course類對象變量。


0 回復 有任何疑惑可以回復我~
#1

七九九

//這樣是不行的,為什么? System.out.println((Course)coursesToSelect.get(0).name); 真正原因:運算優先的問題,先將coursesToSelect.get(0)作為Object類對象,嘗試調用name不成功,強制轉換的優先級靠后了。理由如下: System.out.println(((Course)coursesToSelect.get(0)).name); 這個寫法就可以了,加個括號改變優先級。
2016-02-27 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

請問為什么從ArrayList集合中取出來的對象不能直接調用它的屬性?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號