java面向對象的特征
1.抽象
抽象就是將一類事物的共性抽象出來構造成一個類,抽象只關註該類事物的屬性和行為,而不關註細節,例如Person類,我們只關註它具有性別屬性,而不去關註,具體應該是男是女。我們也只關註它具有吃飯屬性,而不去關註它如何吃,吃什麽的問題。
2.封裝
封裝簡單來說就是隱藏一切可以隱藏的東西,只向外界提供最簡單的編程接口。
3.繼承
繼承是指子類對父類進行繼承,獲取父類的功能,同時進行拓展。軟件的發展也是一個不斷變化拓展的過程,繼承使的軟件具有了延續性和拓展性。
4.多態
多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態分為編譯時多態和運行時多態,方法重載屬於編譯時多態,方法重寫屬於運行時多態,這是多態的兩種實現方式。感覺以代碼描述更為直觀。
編譯時多態(方法重載):
下面是一個Person類,該類中有兩個重載方法eat()
public class Person { //姓名 private String name; //性別 private char sex; //國家 private String nation; public Person(String name,char sex,String nation){ this.name = name; this.sex = sex; this.nation = nation; } public void eat() { System.out.println("吃飯中..."); } public void eat(String food) { System.out.println("吃" + food); } }
我們創建一個Person對象調用兩個eat方法
public class Main { public static void main(String[] args){ Person p1= new Person("馬雲",‘男‘,"中國"); p1.eat(); p1.eat("苗條"); } }
運行結果:
吃飯中...
吃苗條
可見調用了同一個對象的相同方法,卻由於重載具有了不同的表現,這體現了重載多態給程序帶來的擴展性的提升。eat()方法的調用在編譯期,代碼就已經知道該執行哪個方法,因此稱為編譯時多態。
運行時多態(方法重寫):
下面的Chinese類是Person類的子類,重寫了Person類中的eat()方法
public class Chinese extends Person { public void eat() { System.out.println("吃面條中"); } }
下面的American類是Person類的子類,重寫了Person類中的eat()方法
public class American extends Person { public void eat() { System.out.println("吃披薩中"); } }
我們分別創建引用為Person類型的兩個對象Chinese和American的實例,然後分別調用eat()方法
public class Main { public static void main(String[] args){ Person ameri = new American(); Person chani = new Chinese(); ameri.eat(); chani.eat(); } }
運行結果:
吃披薩中
吃面條中
從運行結果可以看出,指向相同引用的兩個對象調用相同的方法,但表現卻不盡相同,這便是運行時多態,代碼具體調用哪一個eat()只有在運行時才能知道,根據對應的引用所指向的內存中的對象,找到對應的該對象所實現的eat()方法進行調用執行。從上面的模擬中也可以看出多態所帶來的強大的擴展性,這便是多態存在的意義。
不對之處請指正。
java面向對象的特征