一.類的封裝
封裝是面向對象編程的核心思想。封裝的載體是類,且對象的屬性和行為被封裝在這個類中。
例:顧客到餐館吃飯,點了一盤魚香肉絲,感覺味道很好吃,顧客就想直到廚師的名字,方便接下來的菜品都讓這個廚師負責。按照生活日常場景來說,顧客接觸的是服務員,服務員接觸廚師,而廚師被封裝在餐廳裡,顧客無法直接接觸廚師。代碼如下:
顧客只能指定接觸服務員,無法與封裝的廚師進行互動,保證了封裝的特性。
二.類的繼承
繼承的基本思想是基於某個父類的擴展,並指定一個新的子類,子類可以繼承父類原有的屬性及方法,也可以增加原來父類所不具備的屬性和方法,或者直接在父類原有方法上重寫。
1.extends關鍵字
在Java中,讓一個類繼承另一個類需要使用extends關鍵字,語法如下:
child extends parents
子類child繼承父類parents的時候,也得到了parents中的屬性及方法。
注:Java中僅支持單繼承,及一個類只能有一個父類
child extends parents1,parents2{//錯誤的繼承
}
創建一個電腦類Computer,電腦類具有屏幕屬性screen和開機方法starup()。現Computer類有一個子類Pad(平板電腦)類 ,在父類的基礎上,又多出一個battery(電池)屬性,代碼如如下:
從代碼可以看出,子類pad沒出現定義屏幕屬性和開機方法,但仍可以訪問父類的屬性和方法,就是從父類繼承過來的,保證了繼承的特性。
2.方法重寫
父類的方法都會繼承給子類,但是如果父類的某個方法不適用於子類時,子類就可以重寫這個方法。
1.重寫的實現
繼承並不只是擴展父類的功能,它還可以重寫父類的成員方法。重寫就是在子類中將父類的方法名保留,但重新編寫方法內部的功能。
在繼承中還有一種特殊重寫方式,子類與父類的成員方法返回值,方法名稱,參數類型及個數完全相同,唯一不同的是方法實現內容,這種特殊的重寫方式被稱為重構。
注:當重寫父類方法時,修改方法的修飾權限只能從小到大的範圍改變,例如:
public void doit() private void doit() //這種重寫方式為錯誤的
編寫一個程序,平板電腦類是普通電腦類的子類,當使用普通電腦時,普通電腦會提示你“歡迎使用”,而使用平板電腦則會提示“歡迎進入ipad”,代碼如下:
2.super關鍵字
如果子類重寫了父類的方法,也就再也無法調用到父類的方法了嗎?如果想在子類的方法中實現父類的原有方法怎麼辦?為了解決這種需求,Java提供了關鍵字super,super關鍵字代表父類對象,使用方式如下:
super.property//調用父類屬性 super.method()//調用父類方法
3.所有類的父類--Object
在一開始學習類class關鍵字的時候,就已經使用到了繼承原理,因為在Java中,所有的類都是直接或間接繼承了java.lang.Object類,這個類比較特殊,他是所有類的父類,是Java中的最高層。當創建一個類時,除非指定繼承了某個類,否則都是默認繼承Object,例如Sring類,Interger類等,因為所有類都是Object的子類,所以在創建類時,省略了exends語句。
class Anything{ } class Anything exends Object{ }
Object類中主要包括了clone(),finalize(),equals(),toString(),等方法,其中常用的就是equals()跟toString()。由於繼承原理,任何類都可以重寫Object類中的方法。
注:final類型的方法不能被重寫
getClass():方法返回某個對象的class實例,然後可以通過class調用getName()方法獲取類名。
toString():方法會返回某個對象的字符串表示形式,當打印某個對象時,自動調用重寫後的toString()方法,console界面就會顯示當前對象的字符串形式。
equals():比較兩個對象的引用地址是否相等。
三.類的多態
在Java中,多態的含義為:一種定義,多種實現。
1.方法重載
構造方法的名稱由類名決定,如果以不同的形式創建某個類的對象,那麼就需要使用不同形參的構造方法來完成。為了讓這些方法名相同但形參不同的構造方法同時存在,必須用到方法重載,雖然方法重載起源於構造方法,但是其他方法也可以使用。
方法重載就是在同一個類中允許存在相同的方法名,但是參數個數或者參數類型不同。
創建OverLoadTest類,類中編寫add()方法的多個重載楔形,然後在主方法種分別輸出這些方法的返回值,代碼如下:
2.向上轉型
Java中,對象類型的轉換包括向上和向下,例如,平行四邊形是一種特殊的四邊形,也就說平行四邊形是四邊形的一種,那麼就可以將平行四邊形看作四邊形的對象。
創建Quadrangle類,在創建Parallelongram子類繼承Quadrangle類,在主方法中調用draw()方法,代碼如下:
代碼可以看到,子類對象賦值給了父類類型的對象,這種技術被稱為“向上轉型”
向上轉型是安全的,即平行四邊形是四邊形,但不能說四邊形是平行四邊形。
3.向下轉型
修改代碼,在Parallelongram子類的主方法中將父類Quadrangle的對象賦值給子類對象的引用變量,這樣程序會產生錯誤,代碼如下;
在做向下轉型操作時,需要告知編譯器,使它認定這個四邊形就是平行四邊形的對象,將父類強制轉化為某個子類對象的方式被稱為顯式類型轉換。代碼如下:
4.instanceof 關鍵字
當程序執行向下轉型操作時,如果父類對象不是子類的實例,就會發生ClassCastException異常,所以在執行某個向下轉型之前需要使用instanceof關鍵字判斷父類對象是否為子類實例。instanceof還可以判斷是否實現某個接口,語法格式如下:
myobject instanceof ExampleClass
myobject :某個對象引用
ExampleClass:父類
方法返回值為布爾類型。
四.抽象類與接口
1.抽象類與抽象方法
在Java中,抽象類不能產生對象實例化,定義抽象類時,用到關鍵字abstract,語法如下:
權限修飾符 abstract class 類名{ }
使用abstract關鍵字創建類就是抽象類,使用abstract關鍵字創建方法就是抽象方法
權限修飾符 abstract 方法返回值類型 方法名(參數列表);
抽象方法沒用方法體,本身無實際意義,除非被重寫,而承載抽象方法的抽象類必須被繼承。實際上,抽象類除了被繼承外,毫無意義。
2.接口的聲明與實現
接口為抽象類的衍生,可以把它看作純粹的抽象類,接口中的所有方法都沒有方法體。Java中單繼承,多實現,類只允許繼承一個類,但可以實現無數接口,當一個類需要重寫多方法時,就可以使用接口,接口使用interface關鍵字進行定義,語法如下:
修飾符 interface 接口名 {
}
//與類相同,可以直接在包中創建,new -> interface。
接口中的方法都是抽象方法,沒用方法主體
類實現接口使用implements關鍵字,代碼如下:
public class Parallelongram implements Inter{
}
注:在接口中定義任何變量都是static和final的,實現接口的子類不能對接口中的變量重新賦值。
平行四邊形實現畫圖接口,重寫接口的方法draw()。
3.多重實現
Java中不允許多繼承,但是可以多實現。
class 類名 implements 接口1,接口2,接口3。。。。
4.區分抽象類與接口
抽象類與接口都包含可以由子類繼承實現的成員,但抽象類是對根源的抽象,而接口則是對動作的抽象,主要有以下幾點區別:
- 子類只能單繼承抽象類,但可以多實現接口
- 接口的方法都是抽象方法,抽象類可以存在實體方法
- 抽象類中的成員變量可以是各種類型,接口中只能是靜態常量
- 抽象類中可以有靜態方法和靜態代碼塊等,接口不可以
- 接口沒有構造方法,抽象類可以有
五.訪問控制
1.訪問控制符
本章最開始介紹封裝有兩個方面的含義,該隱藏的隱藏,該訪問的訪問。這兩個方面都需要使用訪問修飾符來實現,Java訪問修飾符包括public,protected,private和(缺省default)
如果不使用public修飾符設置類的權限,這這個類默認缺省修飾。
使用訪問控制符時,遵循以下幾個原則:
- 大部分頂級類都是用public修飾
- 如果某個類主要用作其他類的父類,那麼該類大部分方法被用於重寫,而不是外界訪問,多用protected修飾
- 類中的絕大部分屬性用private修飾,除非一些靜態static或類似全局變量的屬性,考慮使用public
- 當定義的方法只是用於輔助實現該類的其他方法(即工具方法)時,應使用private修飾
- 希望允許其他類自由使用的方法應使用public修飾。
2.Java類包
Java中定義好每一個類,通過Java編譯器進行編譯之後,都會生成一個.class的後綴文件,當這個程序規模逐漸擴大時,就很容易發生類名衝突的現象JDK API提供了成千上萬的功能類,又是如何實現的呢?
Java中提供了一種管理文件的機制--包。包不僅可以解決類名衝突問題,在大型項目開發時可以幫助開發人員區分類,管理很多程序組件,方便後期維護。
file -- new --package
3.final關鍵字
final的含義是“最後的,最終的”,被final修飾的類,方法,變量不能被改變。
當某個類被final修飾,類中的所有方法都隱式被final修飾,但final類中的成員變量既可以被定義為final形式,又可以被定義為非final形式。
final class 類名{}
final修飾的方法不能被重寫
public final void test(){ }
final修飾變量,就不可以再改變變量的值,通常被final修飾的變量被稱為常量
final double d = 3.1415926;
六.內部類
如果在一個類中定義另一個類,那麼就把在類中定義的那個類稱之為內部類。
1.成員內部類
除成員變量,方法和構造器可以作為類的成員外,成員內部類也可以作為類的成員語法如下:
public class OuterClass { //外部類 private class InnerClass{ //內部類 // } }
創建內部類對象與創建普通類對象的方式相同,都用到關鍵字new,如果在外部類初始化一個內部類,那麼內部類對象就會綁定在外部類對象上。
創建汽車Car類,Car類有屬性brand和方法start()然後在Car類內部創建一個類Engine,Engine類有屬性model和方法ignite(),最後打印“啟動汽車,發動機點火”代碼如下:
2.匿名內部類
匿名內部類的特點就是隻是用一次,也就是說不能被重複使用。串講匿名內部類的實例後,匿名內部類立即消失。匿名內部類的所有實現代碼都需要在大括號之間進行編寫,最常用的創建匿名內部類的方式是創建某個接口類型或抽象類的對象,如法如下:
new A(){
//匿名內部類類體
}
要遵循以下原則:
- 沒有構造方法
- 不能定義靜態成員
- 不能被private,public,protected,static,final,abstract等修飾
- 只可以創建一個匿名內部類
以上就是我們第四章Java面向對象的第二小節,感謝讀者翻閱,辛苦小夥伴點個贊哦。