版權聲明:請尊重個人勞動成果,轉載注明出處,謝謝!
對象 是類的一個執行個體(對象不是找個女朋友),有狀态和行為。例如,一條狗是一個對象,它的狀态有:顔色、名字、品種;行為有:搖尾巴、叫、吃等。 類 是一個模闆,它描述一類對象的行為和狀态。
1 . 封裝性
将對象的狀态資訊盡可能的隐藏在對象内部,隻保留有限的接口和方法與外界進行互動,進而避免了外界對對象内部屬性的破壞。
java支援4種不同的通路權限。
預設的,也稱為default,在同一包内可見,不使用任何修飾符。
私有的,以private修飾符指定,在同一類内可見。
共有的,以public修飾符指定,對所有類可見。
受保護的,以protected修飾符指定,對同一包内的類和所有子類可見。
2. 繼承
java通過繼承建立分等級層次的類,可以了解為一個對象從另一個對象擷取屬性的過程。
類的繼承是單一繼承,也就是說,一個子類隻能擁有一個父類
下面的做法是不合法的:
但是我們可以用多繼承接口來實作, 如:
繼承中最常使用的兩個關鍵字是extends(用于基本類和抽象類)和implements(用于接口)。
注意:子類擁有父類所有的成員變量,但對于父類private的成員變量卻沒有通路權限,這保障了父類的封裝性。
下面是使用關鍵字extends實作繼承。
通過使用關鍵字extends,子類可以繼承父類所有的方法和屬性,但是無法使用 private(私有) 的方法和屬性。
我們通過使用instanceof 操作符能夠确定一個對象是另一個對象的一個分類。
結果如下:
implements關鍵字使用在類繼承接口的情況下, 這種情況不能使用關鍵字extends。
可以使用 instanceof 運算符來檢驗mammal和dog對象是否是animal類的一個執行個體。
運作結果如下:
3.多态
多态是同一個行為具有多個不同表現形式或形态的能力。
多态性是對象多種表現形式的展現
比如:我到寵物店說”請給我一隻寵物”,服務員給我小貓、小狗或者蜥蜴都可以,我們就說”寵物”這個對象就具備多态性。
因為deer類具有多重繼承,是以它具有多态性。
通路一個對象的唯一方法就是通過引用型變量 (編譯時變量)。
引用型變量隻能有一種類型,一旦被聲明,引用型變量的類型就不能被改變了。
引用型變量不僅能夠被重置為其他對象,前提是這些對象沒有被聲明為final。還可以引用和它類型相同的或者相相容的對象。它可以聲明為類類型或者接口類型。
所有的引用型變量d,a,v,o都指向堆中相同的deer對象。
我們來看下面這個例子:
運作結果:
說明:bird類繼承animal并重寫了其方法。
因為animal b = new bird(),編譯時變量和運作時變量不一樣,是以多态發生了。可以從最後的運作結果中看出,調用了父類的成員變量name和子類重寫後的兩個方法。
上面繼承說了,子類可以調用父類所有非private的方法和屬性。因為name是一個string的對象,與方法不同,對象的域不具有多态性。通過引用變量來通路其包含的執行個體變量時,系統總是視圖通路它編譯時類型所定義的變量,而不是他運作時類型所定義的變量。
那麼問題來了,如果我們把animal的成員變量換成private,那會不會去調用bird類的成員變量name來列印輸出呢?
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI3YjM0AzMzUTMzEDNwYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
也就是說 系統通路的始終是去通路編譯時類型所定義的變量。
重寫定義:子類對父類的允許通路的方法的實作過程進行重新編寫!傳回值和形參都不能改變。即外殼不變,核心重寫!