java基礎之面向物件(封裝,繼承,多型)
萬物皆物件,在面向物件思想裡,封裝,繼承,多型我們可能不會特別總視它。什麼是面向物件?什麼是封裝,什麼是繼承?什麼是多型?什麼介面?什麼是抽象?介面與抽象之間的關係?在面試過程中,我回答的支支吾吾,深刻發現到自己對面向物件沒有一個系統的,深刻的理解,一切只停留在課本上,只有一個淺顯的認識。在面試官的交談中,面試官給我講解了那些我理解不夠深刻的知識,算是我目前為止,遇到的面試官,人很好,就想個老大哥一樣,交談很舒適和放鬆。現在讓我重新認識一下面向物件把!
java面向物件的三大特徵:封裝,繼承,多型
1、封裝:java中的封裝是指一個類把自己內部的實現細節進行隱藏,,只暴露對外的介面(getter和setter)方法,封裝又分為屬性的封裝和方法的封裝。封裝又分為屬性的封裝和方法的封裝,把屬性定義為私有地,他們通過setter和getter方法來對屬性的值進行設定和獲取。
1 public class Person{ 2 3 private int id; 4 private String name; 5 private persion; 6 7 8 public int getId(){ 9 return id;} 10 11 public String getName(){ 12 return name;} 13 14 public String getPerson(){ 15 return person; 16 } 17 18 public void setId(int id){ 19 this.id=id; 20 21 }22 public void setName(String name){ 23 this.name= name; 24 } 25 public void setPerson(Person person){ 26 this.person= person; 27 } 28 29 }
在Person類中,定義類三個成員變數,分別為id,name,perosn,他們的訪問修飾都是private私有的,通過setter和getter方法對這些變數進行設值以及取值。封裝的意義就是增強類的資訊隱藏與模組化。封裝的主要作用是對外部隱藏具體的實現細節,增加程式的安全性。
2、繼承
java中的繼承是指在一個現有類(父類)的基礎上在構建一個新類(子類),子類可以整合父類的成員以及成員方法(但是不一定能訪問或呼叫,例如private的私有地成員變數以及方法不能訪問和呼叫)。繼承的作用是能提高程式碼的複用性。子類擁有父類中的一切(擁有不一定能使用),它可以訪問和使用父類中的非私有成員變數,以及重寫父類中的非私有成員方法。
父類:
public class Person{ private int a= 1;父類的私有屬性 private int id; private String name; private int age; public int getID(){ return id; } public void setId(){ this.id=id; } public String getName(){ return name; } public String setName(String name){ this.name=name; } public int Age(){ return age(); } public void setAge(int age){ this.age=age; } @Override public String toString(){ return "Person [id="+id+",name="+name+",age="+age+"]";} } public void say(){ System.out.println("person say"); } public void run(){ System.out.println("person run.."); } //父類的私有方法 private void show(){ System.out.println(“persion show...”); } }
子類:
public class Student extends Person{ @Override public void say(){ super.say(); } @Override public void run(){ super.run(); } public static void main(String[] args){ Student st = new Student(); //st.show();//子類物件呼叫父類的私有方法,報錯!!! st.say(); st.run(); } }
繼承的好處是實現程式碼的服用以及擴充套件,子類通過對父類程式碼的複用,可以不用再定義父類中已經定義好多的成員變數,方法上直接對父類的方法進行重寫實現了擴充套件。
3、多型:
多型就是指多種狀態,就是說當一個操作在不同的物件時,有產生不同的結果。
在Java中,實現多型的方式有兩種,一種是編譯時的多型,另一種是執行時多型,編譯時的多型是通過方法的過載實現的,而執行時多型是通過方法的重寫實現的。
方法的過載是指在同一個類中,有多個方法名相同的方法,但是這些方法有著不同的引數列表,在編譯期我們就可以確定到底呼叫了那個方法。
方法的重寫,子類重寫父類中的方法(包括介面的實現),父類的引用不僅可以指向父類的物件,而且還可以指向子類的物件。當父類的引用指向子類的引用時,只有在執行時才能確定呼叫那個方法。
在執行時的多型需要滿足三個條件:1、繼承(包括介面的實現);2、方法的重寫;3、父類的引用指向子類;
執行時的多型:
介面:
public inteface Animal{ void shout();
實現類:
public class Dog implements Animal{ @Override public void shout(){ System.out.println("wangwang"); } }
實現類:
public class Cat implement Animal{ @Override public void shout(){ System.out.println("喵喵"); } }
測試:
public class AnimalTest{ public static void main(String[] args){ //父類的引用指向子類物件 Animal d = new Dog(); animalShot(d); //父類的引用指向子類物件 Animal c = new Cat(); animalShout(c); } public static void animalShout(Animal animal){ animal.shout(); } }
面向物件的核心雖然是這短短的六個字,但想把這六個字用活,用好,需要我們不斷地學習和認識它。
(在面試的時候,遇到一個優秀面試官,能讓菜雞不斷地成長。。。) ,下一節在寫寫介面啊,抽象啊,再重新認識下。總之,面向物件的開發,是以物件為中心的,額額,我好像還沒有物件,自己建立一個把