面向過程:咱們之前使用的是面向過程編程,你須要清除每一個實現步驟,每一個步驟每行代碼都要仔仔細細的編寫,java
不知道過程就找不到結果,找到實現過程就能夠獲得實現結果。編程
例如: 咱們在外打工租房子,咱們須要瞭解每一個每一個房屋的出租信息,否則是找不到房子的。數組
面向對象:對象幫咱們作事情,找到對應的對象咱們就能夠獲得想要的結果。安全
例如: 咱們找房子不在如此的繁瑣,只要找到中介咱們就不怕沒有地方住,中介會幫你找房子,你只需支付對應的服務費便可。ide
面向對象的三大特徵給咱們帶了巨大的好處,下面咱們就來說解一下。this
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來限制它的範圍spa
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(); } } } }