天天看點

多态的的實作機制                                        多态的的實作機制

                                        多态的的實作機制

多态的的實作機制                                        多态的的實作機制

目錄

                                        多态的的實作機制

一:概述

二:多态的表現方式

1.方法重載(overload)

2.方法覆寫(override)

三:重載與覆寫的差別

1.重載:

2.覆寫:

3.總結:

一:概述

多态作為Java面向對象程式設計開發的一大特性,是面向對象程式設計中實作代碼重用(複用)的一個重要的機制,它主要展現在,當我們操作對象的時候,同樣的操作針對于不同的對象,會産生不同的效果,進而實作不同的功能。

比如String類中的“+”操作,“1+2”用來實作兩個整數型數字的相加,而“1”+“2”實作的卻是兩個字元串的連接配接操作。同樣的對象,産生的結果卻是不相同的。

二:多态的表現方式

在Java中多态的表現方式有兩種:重載(overload)、覆寫(override)。

1.方法重載(overload)

既然說到了重載,那麼什麼是重載(重載的具體實作)呢?重載就是指在同一個類中,有多個方法的方法簽名相同,但是它們方法的參數類型,參數個數不一樣,方法的傳回類型可以不相同,方法的修飾符也可以不相同。示範如下:

class Demo{
    int NUMBER;
    Demo() {
        System.out.println("無參構造函數");
        NUMBER = 4;
    }
    Demo(int i) {
        System.out.println("i的值為: " + i );
        NUMBER= i;
    }
    void info() {
        System.out.println("NUMBER的值為: " + NUMBER);
    }
    void info(String s) {
        System.out.println("i的值為: "+ s + ";NUMBER的值為: " + NUMBER);
    }
}
public class DemoMain {
    public static void main(String[] args) {
        Demo t = new Demo(3);
        t.info();
        t.info("重載方法");
        //重載構造函數
        new Demo();
    }
}
           

是以在編譯時就可以确定該調用的方法。是以說重載可以看做是一個類中方法的多态性。

2.方法覆寫(override)

在之前的繼承與組合中就已經提到了覆寫,當子類中定義的成員變量與父類中的成員變量重名,子類中的方法簽名與父類中的方法簽名相同(重名)時都會出現覆寫。

子類可以覆寫父類的方法,是以在父類與子類中同樣的Math卻有着不同的表現形式。在Java中,基類(父類)的引用變量不僅指向基類(父類)的執行個體化對象,也可以指向其派生類(子類)的執行個體化對象;同樣,接口的引用變量也可以指向其實作類的執行個體化對象。方法的覆寫原則如下:

覆寫方法必須和父類中被覆寫的方法有着相同的方法簽名、參數和傳回值類型(繼承與組合提到過)。 覆寫方法不能有着比父類中被覆寫的方法更嚴格的通路權限(非私有性)。 覆寫方法不能比父類中被覆寫方法抛出更多的異常。如下:

class Demo{
    public Demo(){
        Stringinfo();
    } 
    public void info(){
        System.out.println("Demo info()");
    }
    public void Stringinfo(){
        System.out.println("Demo Stringinfo()");
    }
}
class IDemo extends Demo{
    public void info(){
        System.out.println("IDemo info()");
    }
    public void Stringinfo(){
        System.out.println("IDemo Stringinfo()");
    }
}
public class Test{
    public static void main (String [] args){
        Demo demo = new IDemo();
        demo.info();
        demo.Strnginfo();
    }
}
           

由于子類中的IDemo的info()方法和Strnginfo()方法與父類Demo的方法同名,是以,IDemo中的方法會覆寫Demo中的方法,在main方法中調用Demo demo = new IDemo();語句時會調用Demo類中的構造函數,但是因為Java語言的多态性,此時會調用子類(IDemo)中的Stringinfo()方法,而并非父類(Demo)中的Stringinfo()方法。(注意:隻有類中的方法才會有多态的概念,類中的成員是沒有多态概念的)舉例如下:

class Demo{
    public int i = 1;
}
class IDemo extends Demo{
    public int i = 2;
}
public class Test{
    public static void main (String[] args){
        Demo demo = new IDemo();
        System.out.println(demo.i);
    }
}
           

當程式運作後産生的結果依然是i = 1;是以說,成員變量是無法實作多态的,成員變量的值是父類還是子類并不取決于建立對象的類型,而是取決于所定義變量的類型。demo所屬的類型是Demo,是以demo.i的值是Demo中定義的i,而不是IDemo中的i的值,是以i的值仍未1。

三:重載與覆寫的差別

1.重載:

(1):重載通過不同的方法參數來區分(個數、參數類型、參數順序)。

(2):不能通過方法的通路權限、傳回值類型、抛出的異常類型來進行重載。

(3):在繼承中,如果父類的通路權限為private(私有的),那麼就不能在子類中對父類中的方法進行重載,如果此時子類也定義了一個與父類方法簽名相同的函數,此時新定義的這個函數隻是一個新的方法,并不會達到重載的目的。

2.覆寫:

(1):子類中的覆寫方法必須要跟父類中的被覆寫方法有着相同的函數名和參數。

(2):子類中的覆寫方法的傳回值必須和父類中的被覆寫方法的傳回值類型相同。

(3):子類中的覆寫方法抛出的異常跟父類或其子類中的被覆寫方法所抛出的異常相同。

(4):父類中覆寫方法的權限不能為private。

3.總結:

(1)覆寫是子類與父類之間的關系,重載是同一個類中方法之間的關系。

(2)覆寫隻能由一個方法或者一對方法産生關系,重載是多個方法之間的關系。

(3)覆寫要求參數清單相同,重載要求參數清單不同。

(4)覆寫中調用方法體是根據對象的類型來決定的,重載是根據調用的形參清單(參數)來選擇方法體的。