程式導向:我們以前使用的是程式導向程式設計,你需要清除每個實現步驟,每個步驟每行程式碼都要仔仔細細的編寫,
不知道過程就找不到結果,找到實現過程就可以得到實現結果。
例如: 我們在外打工租房子,我們需要了解每個每個房屋的出租資訊,不然是找不到房子的。
物件導向:物件幫我們做事情,找到對應的物件我們就可以得到想要的結果。
例如: 我們找房子不在如此的繁瑣,只要找到中介我們就不怕沒有地方住,中介會幫你找房子,你只需支付對應的服務費即可。
物件導向的三大特徵給我們帶了巨大的好處,下面我們就來講解一下。
1.什麼是封裝?
1.1 封裝是物件導向的三大特徵之一。
1.2 它就是把細節資訊封裝起來,對外提供操作它的對應的方法。
例如:就像一輛車,你從來不關心它是怎麼建造的,你只需要懂怎麼操作它就可以了。
2.怎麼實現封裝
2.1 封裝的實現方式就是將你需要封裝屬性提到一個公共的類中,
將屬性私有化,對外提供setter,getter方法,對需要重複使用的實現過程進行抽取為方法。
3.封裝的好處
3.1 封裝使整個軟體開發複雜度大大降低。
3.2 將需要重複使用的實現過程進行封裝,提高程式碼的重用性。
3.3 你只需找到其對應的方法即可,無需關係它是怎麼實現的。
3.4 私有化資料將資料隱藏,對無需安全考慮的資料通過setter,getter往外提供,對需要考慮安全問題的資料進行私有化。
3.5 你可以對其引數進行限定,適應你的業務範圍。
例如:就像年齡一樣,你宣告的引數型別為int,int是可以為負值的,
但是在我們的現實生活中,
年齡是沒有負值的,這時你可以將年齡對應的setter方法內新增一個
if-else if-else來限制它的範圍
1 package com.jq; 2 3 /** 4 * 封裝 5 */ 6 public class PackageDemo { 7 /** 8 * 將抽象的事物共有的屬性進行私有化 9 */ 10 private String name; 11 private int age; 12 /** 13 * 將不需要對外提供的屬性進行私有化。 14 */ 15 private String phone; 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 /* 29 可以對傳入引數進行限定來適應業務需求 30 */ 31 public void setAge(int age) { 32 if(age<0){ 33 this.age = 1; 34 }else if(age>1000){ 35 this.age=1000; 36 }else{ 37 this.age = age; 38 } 39 } 40 41 /* 42 * 無需關注程式碼細節,只需呼叫即可 43 */ 44 public void eat(){ 45 System.out.println("吃東西"); 46 } 47 /* 48 提高程式碼的重用性 49 */ 50 public Object add(Double numa,Double numb){ 51 return numa+numb; 52 } 53 54 public static void main(String[] args) { 55 //直接呼叫方法實現功能,降低了程式碼的複雜度,也無需關係程式碼的實現過程 56 System.out.println(new PackageDemo().add(1d,2d)); 57 } 58 }
1.什麼是繼承
1.1 繼承就是將共有特徵或者行為進行向上抽取,將其共有的東西進行實現或者抽象化。
例如:小明跟小麗都有年齡、性別和名字,人類也有這三個特徵,
人類的範疇比小明小麗這個特有個體的範圍大,所以可以將年齡、
性別和名字這三個特徵向上抽取。
小明跟小麗都是人,都有吃東西這個功能,所以可以向上抽取,
但是小明可能是南方人,小麗可能是北方人,一個是吃麵食,一個是吃水稻的。
所以可以將這個共有的行為抽象化。讓小明小麗這個特有的個體來進行實現。
2.怎麼樣繼承
2.1 只需將共有的特徵或者行為封裝為物件,然後使用extends這個關鍵字進行繼承即可。
如有抽象方法需要對抽象方法進行實現。
3.繼承的好處
3.1 繼承的好處是對共有的屬性或者行為進行向上提取,降低了程式碼的複雜度。
3.2 繼承為實現多型提供了前提,沒有繼承就沒有多型。
4.注意事項
4.1 繼承時子類共有方法會覆蓋父類的共有方法。
例如:子類父類都有吃東西的方法,子類是吃飯,而父類是吃東西,
在使用多型類建立物件( Fu fu = new Zi() )時,呼叫eat方法是時,會是吃東西而不是吃飯。
4.2 繼承時子類屬性不會覆蓋父類的屬性。
package com.jq; /** * 繼承 */ abstract class human { //抽取共有特徵 String name; int age; //抽取共有方法,特有行為讓其子類實現 public abstract void eat(); @Override public String toString() { return "human{" + "name='" + name + '\'' + ", age=" + age + '}'; } } class XiaoMing extends human{ public XiaoMing() { super.name="小明"; super.age=25; } public void eat() { System.out.println("吃麵"); } } class XiaoLi extends human{ public XiaoLi() { super.name="小麗"; super.age=18; } public void eat() { System.out.println("吃麵"); } } public class ExtendsDemo { public static void main(String[] args) { System.out.println(new XiaoMing()); System.out.println(new XiaoLi()); } }
1.什麼是多型
1.1 多型就是同一個事物但是他具有多種形態。
例如: 一隻二哈,二哈是一隻狗,二哈是犬科動物,二哈是一直動物,這就是多型。
2.怎麼實現多型
2.1 只需具有繼承關係,然後進行型別轉換即可。
3.多型的好處
3.1 多型切換多種形態來使用特有的方法。
4.多型的弊端
4.1 只能使用本形態下的屬性和方法。
4.2 如果在使用陣列或者沒有使用泛型的集合內的物件時,需要用到子類特有的方法,必須用instanceof這個關鍵字來進行型別判斷,
否則有可能會出現ClassCastException這個異常。
package com.jq; /** * 多型 */ class Dog { String name="二哈"; public void call(){ System.out.println("汪汪汪汪"); } } class erha extends Dog { public void eat(){ System.out.println("吃的一手好狗糧"); } } class xiaomao { public void call(){ System.out.println("喵喵喵"); } } public class PolymorphicDemo { public static void main(String[] args) { Object[] animal = {new erha(),new xiaomao()}; for (Object o : animal) { /*Dog dog =(Dog)o; dog.call(); 以上程式碼會拋異常 java.lang.ClassCastException: com.jq.xiaomao cannot be cast to com.jq.Dog */ if(o instanceof Dog){ Dog dog =(Dog)o; dog.call(); }else if(o instanceof xiaomao){ xiaomao cat =(xiaomao)o; cat.call(); } } } }