Java進階篇(一)——介面、繼承與多態,java進階

來源:互聯網
上載者:User

Java進階篇(一)——介面、繼承與多態,java進階

  上一篇“類與對象”又被移出首頁了,問了一下被告知是疑似筆記不能發布在首頁,唉,心疼自己幾秒,看來我的水平還不到位,都寫成“筆記”了。唉,目前也就只有兩三篇沒有被移出首頁,桑心啊桑心啊,但只能繼續這麼寫下去了,我還是先把Java部分寫完吧。

  我最開始寫這些的初衷是因為,幾年前我在學習Java的時候,並沒有找到一個適合初學者的教學流程,要麼不全面,要麼都是講一些Java深入的內容,而像一些Java的教材、圖書,很多前面基礎的內容在列舉執行個體時,都是以後面的知識來舉例的,就比如我曾經看到一本(這裡就不說是哪本了),在最開始講流程式控制制的時候,給的例子居然是Java線程的例子,當時看的那叫一個頭大,自己敲出來運行看看也沒看懂到底想表達什麼。所以我才決定趁著沒事,寫一些關於Java最基礎、最核心的東西,讓對Java有興趣但自學略有困難的朋友有個簡單的學習大綱。當然,寫部落格還有一個很有用的地方就是,假如學完Java後很久沒有再觸碰了,將來某一天如果又需要用到Java,那麼那個時候,自己寫的部落格就是最好的複習資料。對於在校學習的同學,期末考試的內容肯定在我寫的博文裡可以找到滴,至於我沒寫到的知識點,不從事Java工作的話很難遇到,哈哈,不信就拿著你的期末試卷過來找找看咯。話不多說,就是沒事發發牢騷,下面來看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     @Override10     public float getCircumference(float r) {11         float circumference = 2*PI*r;    // 計算圓周長並賦值給circumference12         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;}

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.