Java——面向對象三大特性
java是一門純面向對象的程序設計語言,它具有三大特性,分別是封裝,繼承和多態。
一、封裝
封裝,就是將對象的屬性和方法封裝起來,使用戶知道對象提供的屬性和方法,而不必去探究它的內部實現。比如手機就是一個封裝的對象,使用手機打電話的時候你只要輸入手機號碼就可以了,而不會去管手機是怎樣工作的。采用封裝的原則可以使對象以外的部分不能隨便存取改變對象內部的數據,有效地避免了外部錯誤對內部數據的影響,並且封裝也可提高程序的維護性,當一部分出錯的,只要接口沒變,其他地方就不用改變。
二、繼承
繼承按照平常意思可以理解為兒子從父親那裏繼承財產,這裏的繼承和那個繼承是同一個意思,只是繼承的不是財產,而是屬性和方法,並且實體不是兒子和父親,而是子類和父類。比如動物園有許多動物,其中有鳥,老虎等等。那我們可以編寫一個動物類,一個鳥類。動物園中所有的生物都統稱為動物類,也就是說動物類有著動物園裏所有生物共有的屬性和方法。鳥也屬於動物,但是每一種動物都有不同的特點,比如鳥會飛,也就是說鳥也有著它自己特有的屬性和方法。所以,動物園中的所有動物可以看成是既有著相同的屬性和方法,又有著各自特有的屬性和方法。而那些相同的屬性和方法就可以看成是從父類繼承下來的。所以,鳥類是動物類的子類,動物類是鳥類的父類,而在類的聲明中。可以用關鍵字extends來指明其父類。
語法格式:[修飾符] class 子類名 extends 父類名{}
public class Animal{//父類 int age; String sex;//動物都有的屬性 public void eat(){ System.out.println("吃東西");//動物都有的方法 } public void sleep(){ System.out.println("睡覺"); } } public class Bird extends Animal{//子類 String type; public void fly() { eat();//調用來自於父類的方法 sleep(); System.out.println("鳥會飛"); } }
子類可以繼承父類中所有可以被子類繼承的屬性和方法,但有幾點需註意。
1.只有父類中被public和protected修飾的屬性和方法才能被繼承,而被private修飾的不能被繼承。
2.若子類聲明了與父類同名的方法和屬性,則父類的屬性和方法將被隱藏和覆蓋,不能被繼承。
public class Animal{//父類 int age; String sex;//動物都有的屬性 public void eat(){ System.out.println("吃東西");//動物都有的方法 } public void sleep(){ System.out.println("睡覺"); } } public class Bird extends Animal{//子類 String type; String sex;//動物都有的屬性 public void eat(){ System.out.println("吃東西");//動物都有的方法 } public void fly() { sleep(); System.out.println("鳥會飛"); } }//此時父類的sex和eat()將被隱藏和覆蓋,子類調用的是自己的sex和eat()而不是父類的。
剛剛說到如果在子類中聲明了與父類相同的屬性和方法時,父類的該屬性和方法將被隱藏,那如果想要使用父類的方法和屬性,應該怎麽辦呢?這就要用的super關鍵字了。
super關鍵字主要有兩種用途。
1.調用父類的構造方法。
格式:super(參數列表),但這條語句必須是子類構造方法的第一條語句,否則報錯。
2.操作被隱藏的屬性和方法。
格式:super.屬性,super.方法。
public class Animal{ int age; String sex;//動物都有的屬性 public Animal(int age,String sex) { this.age = age; this.sex = sex; } public void eat(){ System.out.println("吃東西");//動物都有的方法 } public void sleep(){ System.out.println("睡覺"); } } public class Bird extends Animal{ String type; public Bird(int age,String sex,String type) { super(age,sex);//super調用父類構造方法,放在第一句 this.type = type; } public void eat(){ System.out.println("鳥吃東西");//動物都有的方法 } public void fly() { super.eat();//調用隱藏的方法 sleep(); System.out.println("鳥會飛"); } }
三、多態
多態是java語言的三大特性之一,通常使用方法重載和方法覆蓋實現多態。
方法重載是指在一個類中出現多個參數列表不同(可以使參數個數不同,或者參數類型不同,也可以是參數順序不同)但方法名相同的方法。在方法重載時,方法的返回值不能作為區分方法重載的標誌。
而方法覆蓋一般特指子類重寫父類的方法。比如剛剛bird類中的eat()就覆蓋了animal中的eat();覆蓋體現了子類補充或修改父類方法的能力,通過覆蓋,可以使同一個方法在不同子類中表現出不同的行為。
public class Bird extends Animal{ public void eat(){ System.out.println("鳥吃東西,用啄");//動物都有的方法 } } public class Dog extends Animal{ public void eat(){ System.out.println("狗吃東西,用舔");//動物都有的方法 } }
同樣,在方法覆蓋是有幾點需要註意:
1.之類不能覆蓋父類中被final和static修飾的方法
2.子類必須覆蓋父類中被abstract修飾的方法,或者也將該方法聲明為abstract。
3.子類覆蓋父類同名方法時,必須和父類方法的聲明一樣。
向上轉型:一個類可以看做本類類型,也可以看做是其父類或超類類型。取得一個對象的引用並將它看做是其父類的對象,稱為向上轉型。
例:Animal animal = new Bird(); Animal animal = new Dog(); 此時都是向上轉型,但是不能寫成 Bird bird = new Animal();
Java——面向對象三大特性