java學習之路:26.方法的重載,多態,抽象類與接口

在這裏插入圖片描述


1.方法的重載

方法的重載就是在同一個類中允許存在一個以上的同名方法,只要這些方法的參數個數或者類型不同即可。
代碼演示:

public class OverLoadTest {
 // 定義一個方法
    public static int add(int a,int b) { 
        return a + b; 
    }
 // 定義與第一個方法相同名稱,參數類型不同的方法
    public static double add(double a,double b) { 
        return a + b; 
    }
 // 定義與第一個方法參數個體不同的方法
    public static int add(int a) { 
        return a; 
    }
    public static int add(int a,double b) { 
        return 1; 
    }
 // 這個方法與前一個方法參數次序不同
    public static int add(double a,int b) { 
        return 1; 
    }
     public static void main(String[] args) {
 // TODO Auto-generated method stub
        System.out.println("調用add(int,int)方法:"+add(1,2)); 
        System.out.println("調用add(double,double)方法:"+add(1.2,2.1)); 
        System.out.println("調用add(int)方法:"+add(1)); 
    }
}

運行結果:
在這裏插入圖片描述
根據方法重載的定義:
參數類型不同,構成重載。
參數順序不同,構成重載。
參數個數不同,構成重載。

在談到參數個數不同,構成重載,會涉及到不定長參數方法。
在剛纔的類中添加如下代碼:

public static int add(int...a) { 
    int s = 0; 
    for (int i = 0;i < a.length;i++) { 
        s += a[i]; 
    }
    return s; 
}

運行結果沒有問題,由於它的參數是不定長的,所以滿足根據參數個數不同,構成重載條件。


2.多態

public class Quadrangle {
// 實例化保存四邊形對象的數組對象
    private Quadrangle[] qtest = new Quadrangle[6]; 
    private int nextlndex = 0; 
    public void draw(Quadrangle q) { 
        if (nextlndex < qtest.length) { 
            qtest[nextlndex] = q; 
            System.out.println(nextlndex); 
            nextlndex++;
        }
    }
    public static void main(String[] args) {
    // 實例化兩個四邊形對象,用於調用draw()方法
        Quadrangle q = new Quadrangle(); 
        q.draw(new Square()); // 以正方形對象爲參數調用draw()方法
        q.draw(new Parallelogramgle()); // 以平行四邊形對象爲參數調用draw()方法
    }
}
// 定義一個正方形類,繼承四邊形類
class Square extends Quadrangle{ 
    public Square() { 
        System.out.println("正方形"); 
    }
}
// 定義一個平行四邊形類,繼承四邊形類
class Parallelogramgle extends Quadrangle{ 
    public Parallelogramgle() {
        System.out.println("平行四邊形"); 
    }
}

運行結果:
在這裏插入圖片描述

多態是出現在具有繼承關係的兩個類的對象之間,所以它不像方法重載(發生在一個類中)在編譯期間發生(也就是確定下來),而是在運行期間發生(確定下來)。

比較經典的多態實例是:
有一個Animal類,它有Cat,和Dog兩個子類,在Animal中有個say方法,當Cat調用這個方法的時候輸出的是“小貓喵喵喵”,當Dog調用這個方法時,輸出的是“小狗汪汪汪”,這就是Java多態的實現。


3.抽象類

public abstract class Test{ 
    abstract void testAbstract(); // 定義抽象方法
}

       其中,abstract是定義抽象類的關鍵字。使用abstract關鍵字定義的類稱爲抽象類,而使用這個關鍵字定義的方法稱爲抽象方法。抽象方法沒有方法體,這個方法本身沒有任何意義,除非它被重寫,而承載這個抽象方法的抽象類必須被繼承,實際上抽象類除了被繼承之外沒有任何意義。
       反過來,如果聲明一個抽象的方法,就必須將承載這個抽象方法的類定義爲抽象類,不可能在非抽象類中獲取抽象方法,換句話說,只要類中有一個抽象方法,此類就被標記爲抽象類。
       抽象類被繼承後需要實現其中所有的抽象方法,這樣在多態機制中,就可以將父類修改爲抽象類,將draw()方法設置爲抽象方法,然後每個子類都重寫這個方法來處理。但是程序中就會有太多冗餘的代碼,有時不需要draw()方法的子類也不得不重寫的draw()方法,如果將draw()方法放置在另外一個類中,這樣需要draw()方法的類繼承該類,而不需要draw()方法的類繼承圖形類,但如果所有的子類都需要圖形類,而且Java規定,類不能同時繼承多個父類,面臨這種問題,接口出現了。


4.接口

接口使用interface關鍵字進行定義:

public interface drawTest{ 
    void draw(); //接口內的方法,省略abstract關鍵字
}

在接口中定義的方法必須被定義爲public或abstract形式,其他修飾權限不被Java編譯器認可,即使不將該方法聲明爲public形式,它也是public形式的。
在接口中定義的任何字段都自動是static和final的。

class Parallelogramgle implements drawTest{
// 實現接口 覆蓋draw()方法
    public void draw(){
    // 功能實現
    }
}

Java中無論是將一個類向上轉型爲父類對象,還是向上轉型爲抽象父類對象,或者向上轉型爲該類實現接口都是可以的。
Java不允許多重繼承,但是可以使用多個接口:
class 類名 implements 接口 1,接口 2,接口 3,


若有錯誤,歡迎指正批評,歡迎評論。
每文一句:受挫受辱之時,務須咬牙勵志,蓄其氣而長其智。

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