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