什麼是物件 物件為什麼要被例項化
阿新 • • 發佈:2019-02-08
”一個類的例項” 和 ”一個類的物件" 是說的一個意思
類好比一個模具,物件就是用這個模具造出來的具有相同屬性和方法的具體事物,俗話說:“他倆真像,好像一個模子刻出來的”,就是指的這個意思。
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//同學小芳就是女朋友小芳
類好比一個模具,物件就是用這個模具造出來的具有相同屬性和方法的具體事物,俗話說:“他倆真像,好像一個模子刻出來的”,就是指的這個意思。
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//同學小芳就是女朋友小芳