Java進階篇(一)——接口、繼承與多態


  前幾篇是Java的入門篇,主要是了解一下Java語言的相關知識,從本篇開始是Java的進階篇,這部分內容可以幫助大家用Java開發一些小型應用程序,或者一些小游戲等等。

  本篇的主題是接口、繼承與多態,在看下面的內容之前,首先需要了解一下繼承和多態。繼承機制的使用可以復用一些定義好的類,減少重復代碼的編寫;多態機制的使用可以動態調整對象的調用,降低對象之間的依存關系。有了這些概念,再來看接口是做什么用的。

一、接口

  首先我們需要知道,Java語言只支持單重繼承,不支持多繼承。這句話的意思就是一個類只能有一個父類,但我們經常需要使用多繼承來解決問題,所以Java語言提供了接口來實現類的多重繼承功能。

  1. 接口的定義

  Java中使用interface來定義一個接口,接口定義與類相似(類的定義用的是class),下面直接上例子。

public interface ICalculate {
    final float PI = 3.1415f;        // 定義常量PI,表示圓周率
    float getArea(float r);            // 定義用於計算面積的方法getArea()
    float getCircumference(float r);    // 定義用於計算周長的方法getCircumference()
}

  從上述代碼可以看出,interface是定義了一個接口,接口名為ICalculate(接口一般可以用大寫字母“I”開頭),在接口中可以定義變量和方法,但需要注意的是這里的方法都不能寫方法體,也即方法名后直接加“;”,而方法的實現是寫到實現接口的類中的。還有一點需要注意的是,接口中的所有方法都必須在實現了該接口的類中實現(可以空實現)。

  接下來演示一下Eclipse中如何創建一個接口。

  (1)首先在包上右鍵new一個Interface

  

  (2)填寫接口名並確定

  

  (3)編寫代碼

  

  2. 接口的實現

  上面定義了一個接口,但要實現接口需要在類中用implements關鍵字,下面直接看例子,對應的接口是上例中的ICalculate。

 1 public class Calculate implements ICalculate {
 2 
 3     @Override
 4     public float getArea(float r) {
 5         float area = PI*r*r;        // 計算圓面積並賦值給area
 6         return area;                // 返回area的值
 7     }
 8 
 9     @Override
10     public float getCircumference(float r) {
11         float circumference = 2*PI*r;    // 計算圓周長並賦值給circumference
12         return circumference;            // 返回circumference的值
13     }
14 
15 }

   Eclipse中創建步驟如下:

  (1)填寫類名,點擊Add添加接口

  

  (2)輸入查找接口並確定

  

  (3)接口導入后點擊確定,就可以看到如下界面,填寫相應代碼即可(創建的每個接口中的方法都必須實現,可以空實現,所以不能刪除這里的任何一個方法)

  

  一個類可以實現多個接口,寫法就是implements后的接口間以“,”隔開即可。如果變量沖突,則通過“接口名.變量”來明確指定變量的接口。

二、繼承

  1. 繼承的實現

  在Java中,使用extends關鍵字實現繼承,extends后跟的是父類名,也就是它從哪個類繼承過來的,而用extends的這個類本身稱為子類。

  下面舉個簡單的例子,在生物學中,鴿子屬於鳥的一種,所以鳥是父類,鴿子是子類。

  父類:

public class Bird {
    String color = "灰色";    // 顏色
    String skin = "羽毛";    // 皮毛
}

  子類:

public class Pigeon extends Bird {
    public static void main(String[] args) {
        Pigeon pigeon = new Pigeon();
        System.out.println(pigeon.color);
    }
}

  2. 重寫

  簡單來說就是,如果子類方法名和父類方法名相同,那么子類就不能繼承父類的方法,此時稱子類的方法重寫了父類的方法。重寫也可稱為覆蓋。

  舉個簡單的例子,這是一個動物類,實現了一個voice方法:

public class Animal {
  public Animal() {}
  public void voice() {
        System.out.println("make some voice..");
    }
}

  創建一個Animal類的子類Dog,重寫voice方法發出狗叫:

public class Dog extends Animal{
    public Dog() {}

    @Override
    public void voice(){
        System.out.println("woof...");
    }
}

  再創建一個Animal類的子類Cat,重寫voice方法發出貓叫:

public class Cat extends Animal {
    public Cat() {}

    @Override
    public void voice(){
        System.out.println("nya...");
    }
}

  此時調用dog和cat中的方法都不會出現“make some voise..”字樣,而是對應的狗叫和貓叫。

  但如果此時再創建一個Animal類的子類,但不重寫方法,此時輸出為父類Animal中voice方法的內容,創建一個子類Fish如下:

public class Fish extends Animal{
    public Fish() {}
}

  下面創建一個Zoo類,來調用上述幾個方法測試一下:

public class Zoo {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.voice();

        Cat cat = new Cat();
        cat.voice();
        
        Fish fish = new Fish();
        fish.voice();
    }
}

  運行結果如下:

  

  從運行結果可以看出,由於Dog類和Cat類都重寫了父類的方法voice(),所以執行其相應的方法,而Fish類中沒有重寫,所以執行的是父類中的方法。

  3. super關鍵字

  子類可以調用父類聲明的構造方法,但是必須在子類的構造方法中使用super關鍵字來調用;如果想在子類中操作父類中被隱藏的成員變量和被重寫的成員方法,也可以使用super關鍵字。這些在以后的項目中會出現,這里就不舉例了,如果使用Java編譯器的話,需要使用super關鍵字但未使用時編譯器會有錯誤提示。

三、多態

  在Java中,通常使用方法的重載和重寫實現類的多態性。

  重寫在上面已經介紹過了,而方法的重載是指在一個類中出現多個方法名相同,但參數個數或參數類型不同的方法,下面舉個關於重載的例子。

  比如求圓形和矩形的面積,是兩個名稱為getArea()的方法,它們的參數個數不同,如下:

// 求圓形面積
public float getArea(float r) {
    float area = PI*r*r;
    return area;
}

// 求矩形面積
public float getArea(float a, float b) {  // 重載getArea()方法
    float area = a*b;
    return area;
}

  再比如添加一個學生的信息,是兩個名稱為setStudent()方法,它們的參數類型不同,如下:

// 添加學生號
public void setStudent(int ID) {
    this.stu_id = ID;
}

// 添加求學生姓名
public void setStudent(String name) {
    this.stu_name = name;
}

  需要注意的是,在進行方法的重載時,方法返回值的類型不能作為區分方法的標志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM