物件導向的三大特徵,封裝、繼承、多型的個人理解以及程式碼分析

技高一籌俊G發表於2019-05-29

程式導向:我們以前使用的是程式導向程式設計,你需要清除每個實現步驟,每個步驟每行程式碼都要仔仔細細的編寫,

     不知道過程就找不到結果,找到實現過程就可以得到實現結果。

     例如: 我們在外打工租房子,我們需要了解每個每個房屋的出租資訊,不然是找不到房子的。

物件導向:物件幫我們做事情,找到對應的物件我們就可以得到想要的結果。

       例如: 我們找房子不在如此的繁瑣,只要找到中介我們就不怕沒有地方住,中介會幫你找房子,你只需支付對應的服務費即可。

物件導向的三大特徵給我們帶了巨大的好處,下面我們就來講解一下。

    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();
            }
        }
    }

}

 

    

相關文章