在JAVA中,面向對象由三個特征:封裝、繼承和多态。
1.封裝性:将對象的狀态資訊隐藏在對象内部,外界無法直接操作和修改。(比如在Person類中的age變量,不希望在Person類外随意直接修改它的值,就需要對這個成員變量進行封裝)
1)目的:①隐藏類的實作細節。②讓使用者隻能通過事先預定的方法來通路資料。進而可以在該方法裡加入控制邏輯,限制對成員變量的不合理通路。③課進行資料檢查,進而有利于保證對象資訊的完整性。④便于修改,提高代碼的可維護性。
2)含義:将對象的需要隐藏的成員變量和實作細節隐藏起來,不允許外部直接通路。把方法暴露出來,如果外部要對這些成員變量進行調用或修改,必須通過這些方法來進行通路和操作。
通路控制符:(控制級别由小到大) private ---> default ----> protected ----> public
private:目前類通路權限,隻能在目前類内部被通路。使用它來修飾成員變量就可以把成員變量隐藏在該類的内部。
defalut:(不适用任何通路控制符修飾)包通路權限。default通路控制的成員或外部類可以被相同包下的其他類通路。
protected:子類通路權限,使用該通路控制符修飾,這個成員既可以被同一個包中的其他類通路,也可以被不同包中的子類通路。多用于繼承。
public:公共通路權限。如果要給成員(包括成員變量、方法和構造器等)或者一個外部類使用public通路控制符修飾,這個成員可以被所有類通路,不管通路類和被通路類是否處于同一個包中。
2.繼承性:就是字面意思,子類繼承父類的一些屬性及方法。通過extends關鍵字來實作,實作繼承的類被稱為子類,被繼承的類稱為父類。例如Person類中,Man類和Women類繼承了Person類,這兩個類繼承了年齡,姓名等這些屬性。
1)文法格式 修飾符 class 子類 extends 父類{ }
public class Fruit
{
protected double weight;
public void info(){
System.out.println("我是一個水果! 重" + weight + "g! ");
}
}
public class Apple extends Frutis
{
public static void main(String[] args)
{
Apple a = new Apple();//建立Apple對象,Apple對象本身沒有weight成員變量
//因為Apple的父類有weight成員變量,也可以通路Apple對象的weight成員變量
a.weight = 56;
//調用Apple對象的info()方法
a.info();
}
}
2)子類重寫父類的方法:子類擴充了父類,子類是一個特殊的父類,大部分時候,子類總是以父類為基礎,額外增加心得成員變量和方法。但也存在特殊情況,子類需要重寫父類的方法。比如鳥類是父類,有飛翔這個方法,但是鴕鳥是一種特殊的鳥類,是鳥類的子類,但是鴕鳥不會飛,是以它要重寫飛翔這個方法。
①前提:有子類繼承父類
②子類繼承父類以後,若父類的方法對子類不适用,那麼子類可以對父類的方法重寫(override overwrite)
③.重寫的規則: 1)要求子類方法的“傳回值類型 方法名(參數清單“與父類的方法一樣
2 )子類方法的修飾符不能小于父類方法的修飾符
3)*若父類方法抛異常,那麼子類方法抛的異常類型不能大于父類的。
4)*子父類的方法必須同為static或同為非static的。
super:如果子類重寫了父類的方法,想要調用父類被重寫那個方法,就要用到super關鍵字。Super:可以用來修飾屬性、方法、構造器。
1)當子類與父類中有同名的屬性時,可以通過“super.此屬性”顯式調用父類中的聲明的屬性。若想調用子類的同名的屬性“this.此屬性”
2)當子類重寫父類的方法以後,在子類中若像再顯式的調用父類的被重寫的方法,就需要使用“super.方法”
3)super修飾構造器:通過在子類中使用”super(形參清單)”來顯示調用父類中指定的構造器。
>在構造器内部,“super(形參清單)“必須要聲明在首行!
>在構造器内部,“this(形參清單)“ 或 ”super(形參清單)“隻能出來一個!
>在構造器中,不顯式的調用“this(形參清單)“或”super(形參清單)”其中任何一個,預設調用的是父類空參的構造器!
建議:設計一個類時,盡量要提供一個空參的構造器。
3.多态性:JAVA引用變量有兩個類型:一個是編譯時類型,一個是運作時類型。編譯時類型由聲明該變量時使用的類型決定,運作時類型由實際賦給該變量的對象決定。如果編譯時類型和運作時類型不一緻,就是多态。
1)多态性的表現:①方法的重載與重寫 ②子類對象的多态性
2)使用的前提:①要有繼承關系 ②要有方法的重寫
3)格式:Person p = new Man( );
//虛拟方法調用:通過父類的引用指向子類的對象實體,當調用方法時,實際執行的時子類重寫父類的方法
P1.eat();
P1.walk();
4)編譯時,人為p是Person類型的,故隻能執行Person裡才有的結構,即Man裡特有的結構不能調用
>子類對象的多态性,并不使用于屬性。
5) 關于向下轉型:
① 向下轉型,使用強轉符:()
② 為了保證不報ClassCastException,最好在向下轉型前,進行判斷:instanceof
//若a是A類的執行個體,那麼a也一定是A類的父類的執行個體。
if(p1 instanceof Woman) {
Woman w1 = (Woman)p1;
w1.shopping();
}
if(p1 instanceof Man) {
Man m1 = (Man)p1;
m1.entertainment();
}