面向對象的三大特徵,封裝、繼承、多態的我的理解以及代碼分析

面向過程:咱們之前使用的是面向過程編程,你須要清除每一個實現步驟,每一個步驟每行代碼都要仔仔細細的編寫,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();
            }
        }
    }

}
相關文章
相關標籤/搜索