【Java】Java面向對象之封裝、繼承、多態

一、封裝

        定義:封裝就是將同一類事物的特性與功能包裝在一起,對外暴露調用的接口。

   封裝可以可以被認爲是一個保護屏障,防止該類的代碼和數據被外部定義的代碼隨機訪問。並且封裝的主要功能在於我們能夠修改自己實現的代碼,而不用修改哪些調用我們代碼的程序片段。

    適當的封裝可以讓我們的代碼更容易理解和維護,也加強了代碼的安全性。

        封裝的優點:

    1)解耦

    2)類內部的結構可以自由修改

    3)對成員變量進行 更精確的控制

    4)隱藏信息,實現細節。

       封裝的實現步驟:

==》修改屬性的可見性(設爲private)

==》創建getter/setter方法(用於屬性的讀寫)

==》在getter/setter方法中加入屬性控制語句(對屬性值進行合法性的判斷)

package EncapsulationDemo;/*
 * @author   :James
 * @date     :2020/6/28 14:56
 * @Email    :[email protected]
 * Version   :V1.0
 * @Function :
 */
public class People {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length()>10){
            System.out.println("長度過長,請重新輸入");
        }else{
            this.name = name;
        }
    }
}

運行結果:

二、繼承

        概念:繼承是子類繼承父類的特徵和行爲,使得子類對象(實例)具有和父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲

生活中的繼承:

                                                 

     上圖繼承關係可以瞭解到:動物屬於父類(或者說基類或超類),食草動物和食肉動物分別是動物的子類(或者說是派生類)。而食草動物和食肉動物分別是子類(派生類)兔子和羊。老虎和獅子的父類。

    繼承特點:

      1)子類可以擁有父類的內容:(都有名稱,有五官等等)。

      2)子類可以擁有自己專有的內容。(食草動物喫草,就是食草動物專有的內容,食肉動物喫肉,就屬於食肉動物專有的內容)

繼承的特性

1)子類擁有父類非private的屬性、方法

2)子類可以擁有自己的屬性和方法,也就是說子類可以對父類進行擴展

3)子類用自己的方式實現父類的方法

4)繼承是單繼承,也可以是多重繼承,但是不能是多繼承

5)提高了類的耦合性

關於單繼承、多級繼承圖示:

        在繼承關係中,如果成員變量重名,則在創建子類對象的時候,有兩種訪問方式

1)直接通過子類對象訪問成員變量(等號左邊是誰,就優先用誰,沒有則向上找)

2)間接通過成員方法訪問成員變量(該方法屬於誰,就優先用誰,沒有則向上找)

  如何區分子類方法中重名的三種變量?

   --》局部變量:直接寫成員變量名

   --》本類中的成員變量:this.成員變量名

   --》父類中的成員變量名:super.成員變量名

詳細例子參照下面的代碼:

 繼承關鍵字:Java中使用extends和implements來實現繼承,前者多用於類與類之間後者用於類與接口之間的繼承。

public class Fu {
    String father="Father";
    int num=12;
    public void methodFu(){
        System.out.println("我是父類的方法");
    }
}
public class Zi extends Fu{
    String son="Son";
    int num=345;
    public void methodZi(){
        int num=123;
        System.out.println("我是子類方法");
        System.out.println(this.num );     //輸出結果:345
        System.out.println(super.num );    //輸出結果:12
        System.out.println(num );          //輸出結果:10
    }
}
public class DemoExtends {
    public static void main(String[] args) {
        Zi zi=new Zi();
        zi.methodZi();                //輸出結果:這是子類的方法
        zi.methodFu();                //輸出結果:這是父類的方法
        System.out.println(zi.son);   //輸出結果:Son
        System.out.println(zi.father);//輸出結果:Father
        System.out.println(zi.num);   //輸出結果:34535
    }
}

關於成員變量、局部變量和類變量:

       類變量(靜態變量):用static修飾的變量成爲靜態變量,其內容被該類所有對象共享,所有對象中的這個類變量的值都指向相同的一處內存,隨便一個對象修改了此處內存的值都會影響其他對象

       成員變量:定義在方法外部,直接寫在類當中,整個類都可以調用,如果沒有賦值則會有一個默認值,規則和數組一樣,成員變量位於堆內存當中。成員變量隨着對象的創建而誕生,隨着對象的回收而消失

       局部變量:定義在方法內部,只有方法中才可以調用,除了方法就不能調用了,局部變量沒有默認值,如果想要使用,必須手動進行賦值,其位於棧內存當中。局部變量隨着方法進棧而誕生,隨着方法出棧而消失 。    

     關於繼承過程中的重寫:

       重寫(override):方法名稱一樣,參數列表也一樣

       重載(overload):方法名稱一樣,參數列表不一樣

  注意事項:

   1)必須保證父子類之間的方法的名稱相同,參數列表也相同,@override:寫在方法前面,用來檢測是不是有效的正確覆蓋重寫,

  2)子類方法的返回值必須【小於等於】父類方法的返回值範圍。

  3)子類方法的權限必須【大於等於】父類方法的權限修飾符。

        重寫應用場景:

public class Fu {
    String father="Father";
    int num=12;
    public void methodFu(){
        System.out.println("我是父類的方法");
    }
}
public class Zi extends Fu{
    @Override
    public void methodFu() {
        System.out.println("覆蓋了父類的方法");
    }
}
public class DemoExtends {
    public static void main(String[] args) {
        Zi zi=new Zi();
        zi.methodFu();   //輸出結果:覆蓋了父類的方法
    }
}

三、多態

多態是同一個行爲具有多個不同的表現形式或者形態的能力。多態存在的三個必要條件:

1)繼承             2)重寫                      3)父類引用指向子類對象

多態的優點:

1)消除類型之間的耦合關係                 2)可替換性                             3)接口性

4)靈活性                                              5)簡化性                                 6)可擴充性

多態實例:

--》接口

public interface InterfaceUSB {
    public abstract void powerOn();
    public abstract void powerOff();
}

--》兩個實現類

public class KeypressInterface implements InterfaceUSB{
    @Override
    public void powerOn() {
        System.out.println("鍵盤已連接");
    }

    @Override
    public void powerOff() {
        System.out.println("鍵盤已斷開");
    }

    public void type(){
        System.out.println("鍵盤輸入");
    }
}
public class MouseInterface implements InterfaceUSB{
    @Override
    public void powerOn() {
        System.out.println("連接鼠標");
    }

    @Override
    public void powerOff() {
        System.out.println("關閉鼠標");
    }
    public void click (){
        System.out.println("鼠標點擊");
    }
}

--》主體代碼

public class Computer {
    public void powerOn() {
        System.out.println("開機已就緒");
    }

    public void powerOff() {
        System.out.println("已關機");
    }

    //使用USB設備方法,使用接口作爲方法的參數
    public void useDevice(InterfaceUSB interfaceUSB) {
        interfaceUSB.powerOn();
        if (interfaceUSB instanceof MouseInterface) { // 一定要先判斷
            MouseInterface mouse = (MouseInterface) interfaceUSB; // 向下轉型
            mouse.click();
        } else if (interfaceUSB instanceof KeypressInterface) { // 先判斷
            KeypressInterface keyboard = (KeypressInterface) interfaceUSB; // 向下轉型
            keyboard.type();
        }
        interfaceUSB.powerOff();
    }
}
public class ComputerMain {
    public static void main(String[] args) {
        //創建一個筆記本電腦
        Computer computer=new Computer();
        computer.powerOn();
        //準備一個鼠標供電腦使用
        MouseInterface mouseInterface=new MouseInterface();
        computer.useDevice(mouseInterface);
        //創建一個USB鍵盤
        KeypressInterface keypressInterface=new KeypressInterface();
        computer.useDevice(keypressInterface);

        computer.powerOff();
    }
}

  運行結果:

  

        此多態例子中,KeypressInterface和Mouseinterface實現了InterfaceUSB接口,並且除了實現了powerOn和powerOff方法外還都有各自的方法【keypressInterface的鍵入方法,MouseInterface的點擊方法】,並且在代碼中又出現了兩個新的知識點,對象的向上轉型和向下轉型

對象的向上、向下轉型

1)對象的向上轉型,其實就是多態的寫法

格式父類名稱   對象名=new  子類名稱 ();                              InterfaceUSB interfaceMouse=new MouseInterface();

含義右側創建一個子類對象,把它當做父類來看待使用       【上面代碼:創建一個鼠標當接口使用】

2)對象的向下轉型,實際則爲一個【還原】的動作

注意:【向下轉型,需要使用instanceof進行判斷,防止出現ClassCastException(類轉換異常)錯誤

                          

 格式:子類名稱  對象名=(子類名稱)父類對象;
含義:將父類對象,【還原】成爲本來的子類對象

參考鏈接:

            https://www.cnblogs.com/hysum/p/7100874.html

            https://www.cnblogs.com/nongzihong/p/10494453.html

            https://www.cnblogs.com/ygj0930/p/10830957.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章