1類和對象
1.1定義類
類是某一批對象的抽象,可以把類理解成某種概念;對象是一個具體存在的實體。
定義類的格式:
[修飾符] class 類名 {
//0至n個屬性
數據類型 變量名1;
數據類型 變量名2;
//0至n個方法
修飾符 返回值類型 方法名(參數){
執行語句;
}
定義構造器的格式:
[修飾符] 構造器名(形參列表)
{
//零到多個可執行語句
}
注意:修飾符可以省略,也可以是public ,protected,private其中之一;構造器名必須和類名相同;形參列表和定義方法的格式相同。構造器不能定義返回值類型,也不能使用void聲明構造器沒有返回值。
一個類中包含三種最常見的成員:構造器,成員變量和方法。三種成員都可以定義零個或多個。類裏各成員之間的定義順序沒有任何影響,各成員之間可以相互調用,但是static修飾的成員不能訪問沒有static修飾的成員(有static修飾的屬於類本身,沒有static修飾的屬於該類的實例)。
成員變量用於定義該類或該類的實例所包含的狀態數據,方法用於定義該類或者該類實例的行爲特徵或者功能的實現。構造器用於構造該類的實例,java語言通過new關鍵字來調用構造器,從而返回該類的實例。
1.2 創建對象
創建對象的根本途徑是構造器,通過new關鍵字調用該類構造器即可創建該類對象。創建對象的格式:類名對象名 = new 類名();
如果訪問權限允許,類裏定義的方法和成員變量都可以通過類或實例來調用。類或實例訪問方法或成員變量的語法:類.類變量|方法,或者實例.實例變量|方法。static修飾的成員變量或方法,既可以類來調用,也可通過實例來調用;沒有static修飾的成員變量或者方法只能通過實例來調用。
2. 封裝
2.1 封裝概述
封裝是面向對象的三大特徵之一,它指的是將對象的狀態信息隱藏在對象的內部,不允許外部程序直接訪問對象內部信息,而是通過該類所提供的方法來實現對內部信息的操作和訪問。封裝的好處:提高了代碼的複用性;隱藏了實現細節,對外提供公共的訪問方式,便於調用者使用;提高了安全性。
2.2 private關鍵字
private:私有的意思。可以修飾成員變量和成員方法。特點:被private修飾的內容,只能在本類中訪問。
2.3 JavaBean規範
JavaBean 是一種JAVA語言寫成的可重用組件.
1):類必須使用public修飾.
2):必須保證有公共無參數構造器,即使手動提供了帶參數的構造器,也得提供無參數構造器..
3):包含了屬性的操作手段(給屬性賦值,獲取屬性值).
2.4 this關鍵字
Java提供了一個this關鍵字,this關鍵字總是指向調用該方法的對象。根據this出現的位置不同,this作爲對象的默認引用有兩種情形:構造器中,表示當前創建的對象;方法中, 哪一個對象調用this所在的方法,那麼此時this就表示哪一個對象。
3. 繼承
3.1 繼承概述
繼承是面向對象的三大特徵之一,也是實現軟件複用的重要手段。Java的繼承具有單繼承的特點,每個子類只有一個直接父類。
3.2 繼承的特點
Java的繼承通過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類稱爲父類或基類,超類。
3.2.1 繼承的語法格式: 修飾符 class 子類 extends 父類{
}
3.2.2繼承的好處:
1.繼承提高了代碼的複用性,提高了軟件開發效率;
2.繼承讓類與類之間產生了關係,是多態的前提。
注意:
1.在java中類只支持單繼承,不支持多繼承。即一個類只能有一個直接父類;
2.多個類可以繼承一個父類;
3.在java中允許存在多層繼承。即一個類的父類可以再去繼承其它父類;
4.在Java中,子類和父類是一種相對概念,也就是說一個類是某個類父類的同時,也可以是另一個類的子類;
5.子類繼承了父類,將可以得到父類的全部成員變量和方法,但是java的子類不能獲得父類的構造器。
3.3. 重寫父類方法
3.3.1子父類中成員方法的特點
當程序通過對象調用方法時,會先在子類中查找有沒有對應的方法,若子類中存在就會執行子類中的方法,若子類中不存在就會執行父類中的方法。
3.3.2方法覆蓋
子類中出現和父類一模一樣的方法時,會出現方法覆蓋,也稱方法重寫。
3.3.3方法重寫的應用
當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。
在子類中,訪問父類中的成員方法格式: super.父類中的成員方法();
3.3.4方法重寫的原則(一同兩小一大):
一同:
① 實例方法簽名必須相同。 (方法簽名= 方法名 + 方法的參數列表)
兩小:
② 子類方法的返回值類型是和父類方法的返回類型相同或者是其子類。子類可以返回一個更加具體的類.
③ 子類方法聲明拋出的異常類型和父類方法聲明拋出的異常類型相同或者是其子類。子類方法中聲明拋出的異常小於或等於父類方法聲明拋出異常類型;子類方法可以同時聲明拋出多個屬於父類方法聲明拋出異常類的子類(RuntimeException類型除外);
一大:
④ 子類方法的訪問權限比父類方法訪問權 限更大或相等。
private修飾的方法不能被子類所繼承,也就不存在覆蓋的概念.
判斷是否是覆寫方法的必殺技:@Override標籤:若方法是覆寫方法,在方法前或上貼上該標籤, 編譯通過,否則,編譯出錯。只有方法存在覆蓋的概念,字段沒有覆蓋.
4.多態
4.1 多態概述
Java引用變量有兩個類型:一個是編譯時類型,一個是運行時類型。編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。如果編譯時類型與運行時類型不一致,就可能出現多態。多態體現:父類引用變量指向子類對象。多態的前提:必須有子父類關係或者類實現接口。使用多態後父類引用變量調用方法時,會調用子類重寫後的方法。
4.2 多態的定義格式
父類的引用變量指向子類對象
父類類型 變量名 = new 子類類型();
變量名.方法名();
1.普通類多態定義的格式
父類 變量名 = new 子類();
如: class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
2.抽象類多態定義的格式
抽象類 變量名 = new 抽象類子類();
如:abstractclass Fu {
public abstract voidmethod();
}
class Zi extends Fu {
public void method(){
System.out.println(“重寫父類抽象方法”);
}
}
Fu fu= new Zi();
3.接口多態定義的格式
接口 變量名 = new 接口實現類();
如: interfaceFu {
public abstract void method();
}
class Zi implements Fu {
publicvoid method(){
System.out.println(“重寫接口抽象方法”);
}
}
Fu fu = new Zi();
4.3 多態成員變量與成員方法的特點
1.多態成員變量
當子父類中出現同名的成員變量時,多態調用該變量時:
編譯時期:參考的是引用型變量所屬的類中是否有被調用的成員變量。沒有,編譯失敗。
運行時期:也是調用引用型變量所屬的類中的成員變量。
簡記:編譯和運行都參考等號的左邊。編譯運行看左邊。
2.多態成員方法
編譯時期:參考引用變量所屬的類,如果沒有類中沒有調用的方法,編譯失敗。
運行時期:參考引用變量所指的對象所屬的類,並運行對象所屬類中的成員方法。
簡記:編譯看左邊,運行看右邊。
4.4 instanceof運算符
boolean b = 對象 instanceof 數據類型;
Instanceof運算符的前一個操作數通常是一個引用類型的變量,後一個操作數通常是一個類,它用於判斷前面的對象是否是後面的類,或者其子類,實現類的實例。如果是返回true,否則返回false。
Instanceof運算符的作用:在進行強制類型轉換之前,首先判斷前一個對象是否是後一個類的實例,是否可以成功轉換。Instanceof和(type)是java提供的兩個相關的運算符,通常先用instanceof判斷一個對象是否可以強制類型轉換,然後再使用(type)運算符進行強制類型轉換,從而保證程序不會出現錯誤。
4.5 多態的轉型
1.向上轉型:當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
使用格式:父類類型 變量名 = new 子類類型();
如:Person p =new Student();
2.向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉爲子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的!
使用格式:子類類型 變量名 = (子類類型) 父類類型的變量;
如: Student stu = (Student) p; //變量p 實際上指向Student對象
4.6 多態優缺點
多態的好處:提高了程序的擴展性
多態的弊端:不能訪問子類的特有功能
總結:
封裝:把對象的屬性與方法的實現細節隱藏,僅對外提供一些公共的訪問方式
繼承:子類會自動擁有父類所有可繼承的屬性和方法。
多態:配合繼承與方法重寫提高了代碼的複用性與擴展性;如果沒有方法重寫,則多態同樣沒有意義。