1. 程式人生 > >什麼是物件 物件為什麼要被例項化

什麼是物件 物件為什麼要被例項化

”一個類的例項” 和 ”一個類的物件" 是說的一個意思 
類好比一個模具,物件就是用這個模具造出來的具有相同屬性和方法的具體事物,俗話說:“他倆真像,好像一個模子刻出來的”,就是指的這個意思。 
a instance of A 
這行語句是一個布林表示式,即它的返回值是一個布林值,即真或假, 
那麼這句話是判斷什麼的真或者假呢?首先你要知道instance of是一個關鍵字,也就是這個片語在java原始碼中具有特殊的含義的詞語,這個片語的左邊放一個物件,在這裡是a,這個片語的右邊放一個類,這裡是A(注意java中區分大小寫,a和A不是一個東西),所以 
a instance of A 
這條語句通俗的說就是:“a這個東西是否是A這個模具刻出來的”,用OOP(面向物件程式設計)的話來說就是:“物件a是否是A類的一個例項” 

你的問題如果要沒有歧義的問就應該是:“物件a是否是類A的例項”,而不是“物件a是否是A的一個物件” 

再打個比方說一下類和物件吧:類就是你想象當中的若干個事物的一個種類,比如飛碟,但是如果你定義了一個飛碟類UFO以後,就有飛碟了嗎?答案是,沒有,因為它只是一個模具,當我們想象有飛碟這種東西時,我們還沒有發現任何飛碟的實物。這就是類。 
假設有一天,天空真的出現了幾個飛碟,從東邊飛來了一個藍色的盤狀飛碟,比如代號叫b101;從西邊飛來了一個紅色的球狀飛碟,代號叫r102;從南邊飛來了一個綠色的條形飛碟,代號叫g103;那麼我們就可以說:物件b101,a102,g103都是飛碟類的例項,所以表示式 
b101 instance of UFO 
的返回值就是真,在java中的表達就是true 
那麼飛機,假設有一架飛機我們叫他空軍一號aan1,則表示式 
aan1 instance of UFO 
的返回值就是假,在java中的表達就是false 

事實上instance of關鍵字是不建議使用的,因為它的使用一般意味著該軟體的框架非常之巨大,其中包含的抽象類和藉口巨多,導致有時需要進行這樣的判斷,一個設計得非常健壯,邏輯緊湊的軟體是不應該有這樣的表示式的。 

明白了嗎? 

補充: 
你補充的這個問題,就是問equals函式的作用 
equals的英語意思就是等於,在這裡作為一個函式的名稱,同時這個函式只有物件才能呼叫,這裡你還要知道引用和物件的區別。 
Student stu1 = new Student(); 
Student stu2 = stu1; 
Student stu3 = new Student(); 
問題:這裡有幾個類?幾個物件?幾個引用? 
答案是:一個類,兩個物件,三個引用。 
不要以為stu1和stu2不是同一個東西,在這裡,他們是同一個,所以stu1.equals(stu2)的值就是true(真),而stu1.equals(stu3)的值就是false 
注意需要與instance of區別,instance of是判斷一個引用指向的物件是否是一個類的例項,而equals是判斷一個引用和另一個引用是否是同一個物件。 
再用個通俗的例子給你說說吧: 
我有兩個女同學,一個叫小芳,一個叫小雪,女同學是一個類,其中小芳也是我的女朋友,女朋友也是一個類,這個類繼承自女同學類,那麼就有 
class ClassMate{ //女同學類 

class GirlFriend extends ClassMate{//女朋友類 

class Demo{//測試類 
public void main(String[] args){ 
ClassMate xue = new ClassMate();//同學小雪 
GirlFriend fang = new GirlFriend();//女朋友小芳 
ClassMate fang2 = fang;//同學小芳 


則有 
(xue instance of ClassMate)==true//小雪是同學 
(fang instance of ClassMate)==true//小芳是同學 
(xue instance of GirlFriend)==false//小雪不是女朋友 
(fang instance of GirlFriend)==ture//小芳是女朋友 
----同時---- 
xue.equals(fang)==false//同學小雪不是女朋友小芳 
xue.equals(fang2)==false//同學小雪不是同學小芳 
fang.equals(fang2)=true//同學小芳就是女朋友小芳