天天看點

老王的JAVA基礎課:第5課 面向對象

JAVA面向對象基礎概念

​在JAVA世界中萬物皆對象,我們在開發中都是對各種對象做調用、修改與組合。一個java程式可以認為是一系列對象的組合,而一個對象又來自于類,那麼什麼是類?我們可以簡單了解類是一類事物的基礎模闆。我們以一張圖來學習類和對象的關系以及方法和變量的基礎概念。

老王的JAVA基礎課:第5課 面向對象

在生物課上都學過“界門綱目科屬種”的分類法,現在借用這種方式舉例。假如有一個“鳥”類,它定義了這個鳥的行為和屬性,鳥都有飛行和進食的行為,也存在身高體重等屬性。而“鳥”隻是一個總稱并不是某種具體的鳥,它是百靈鳥、喜鵲、鹦鹉的更粗粒度的說法,也可以說“鳥”這個父類是其他三種鳥類的抽象 ,其飛行和進食的方法都繼承自“鳥”類,如“鹦鹉”類在這個基礎上可以有更加個性化的行為,比如“說話”。隻需要在“鹦鹉”類内定義“說話”方法就實作了全部能力。這就是繼承。

我們有了“百靈鳥”等個性化的類,可以借此來生成各種各樣的“百靈鳥”對象,比如百靈鳥1體重為200克,百靈鳥2的體重為150克等等。展現了Java的多态特性。下面來總結:

  • 類:定義了事物的行為和某些固有屬性或狀态
  • 對象:以類為基礎建構,是一個類的執行個體,百靈鳥派生自“鳥”類,它有飛行和進食的能力,也有自身身高體重等屬性,每個對象在記憶體中都是獨立的。
  • 方法:“鳥”類有飛行和進食的行為,這就是類的方法,派生出的對象也會獲得類的方法,一個類可以有多個方法。
  • 變量:也即變動的量,百靈鳥體重與喜鵲體重是同一個變量但是是不同的值。每個對象都擁有其獨立的變量,如百靈鳥與喜鵲同屬鳥類,但其各自的變量毫不相幹。
  • 繼承:一類事物可以以更高層次的事物為基礎繼承而來,可以讓事物出現層級,如“界門綱目科屬種”。
  • 多态:同一個行為具有不同的表現形式,比如鹦鹉和百靈鳥都會飛,但是鹦鹉飛不高,百靈鳥可以飛得很高。
  • 封裝:我們可以将鳥的一系列行為和熟悉都隐藏在“鳥”類中,進而保護“鳥”類中的方法和屬性不會被破壞,也可以隐藏函數的具體實作細節。
  • 重載(Overload):在一個類裡面,方法名相同而參數個數不同,傳回類型可以相同也可以不同。
  • 重寫(Override):在子類中定義和父類中完全相同的方法,此時子類的方法将會覆寫父類的方法,帶來了可以個性化實作細節的靈活性。

對于重載和重寫我們暫時了解概念即可,在後面的章節我們會詳細講這兩種特性的使用和差別。

構造方法

構造方法是一類特殊的方法,它用來告訴想建立某個類的對象的人“你應該如何建立這個類的對象”,比如“鳥”類有一個沒有參數的構造方法還有一個帶參數的構造方法。注意構造函數沒有傳回類型,不需要編寫。

/** 無參構造方法 */
public Bird(){}
/** 帶參構造方法 */
public Bird(int height, int weight){
    //以下兩行表示将你傳入的身高體重指派給鳥的實際對象,
    //在對象構造完畢時,就擁有了這兩個屬性
    this.height = height;
    this.weight = weight;
}
           

可以用如下兩種方式建立一個“鳥”對象。

//無參構造器建立對象
Bird bird = new Bird();
//帶參數構造器建立對象
Bird bird = new Bird(10, 200);
           

這樣我們得到了一個實實在在的對象,可以控制其飛行或是進食。

bird.fly();
bird.eat();
           

注意:當我們沒有定義任何構造方法時,java會隐式地建立一個無參構造方法,一旦明确編寫帶參數的構造方法時。java就不會替我們生成預設的無參構造方法,如果需要無參構造方法,需要明确編寫。

以上場景的代碼實作

首先最基礎的“鳥”類,Bird.java

**
 * 鳥類
 * @author 老王
 */
public class Bird {

    /** 身高 */
    int height;

    /** 體重 */
    int weight;

    /**
     * 無參構造方法,這裡指明你應該如何構造一個鳥類
     */
    public Bird() {}

    /**
     * 帶參構造方法.
     */
    public Bird(int height, int weight) {
        this.height = height;
        this.weight = weight;
    }

    /**
     * 飛行方法
     */
    public void fly(){
        System.out.println("I can fly high!");
    }

    /**
     * 進食方法
     */
    public void eat(){
        System.out.println("I can eat a lot!");
    }
}
           

“鹦鹉”類:Parrot.java

/**
 * 鹦鹉類,其繼承了鳥類。獲得了鳥類的全部的非私有方法和非私有屬性
 * @author 老王
 */
public class Parrot extends Bird{

    /**
     * 這是鹦鹉類自定義的說話方法
     */
    public void sayHello(){
        System.out.println("I can speak Chinese!");
    }
}
           

“喜鵲”類:Magpie.java

/**
 * 喜鵲類,其繼承了鳥類。同樣獲得了鳥類的全部的非私有方法和非私有屬性
 * @author 老王
 */
public class Magpie extends Bird{

    /**
     * 喜鵲類重寫了父類【Bird】的飛行方法,實作了其自己的個性化飛行方法
     */
    @Override
    public void fly(){
        System.out.println("I can fly very high!");
    }
}
           

測試類:上帝之手 God.java

/**
 * 上帝之手類
 * @author 老王
 */
public class God {

    /**
     * 主程式入口
     */
    public static void main(String[] args) {
        //建立鳥對象的方式,無參和有參構造
        Bird bird1 = new Bird();
        Bird bird2 = new Bird(10, 20);

        //建立鹦鹉對象的方式,由于鹦鹉類繼承自鳥類,是以可以以Bird來建立鹦鹉對象
        Bird parrot1 = new Parrot();
        Parrot parrot2 = new Parrot();
        System.out.println("----------鹦鹉發出的行為----------");
        //鹦鹉學舌,來自于自定義的個性方法,而喜鵲沒有這個方法,是以喜鵲不能說話
        parrot2.sayHello();
        parrot2.fly();
        System.out.println("----------鹦鹉發出的行為----------");

        //建立喜鵲對象的方式,同樣由于喜鵲類繼承自鳥類,是以可以以Bird來建立喜鵲對象
        Bird magpie1 = new Magpie();
        Magpie magpie2 = new Magpie();
        //由于喜鵲類覆寫了鳥類的預設飛行方法,是以喜鵲飛行與衆不同!
        System.out.println("----------喜鵲發出的行為----------");
        magpie2.fly();
        System.out.println("----------鹦鹉發出的行為----------");
    }
}
           

執行結果:

----------鹦鹉發出的行為----------
I can speak Chinese!
I can fly high!
----------鹦鹉發出的行為----------
----------喜鵲發出的行為----------
I can fly very high!
----------鹦鹉發出的行為----------
           

總結

通過這節課我們學習了類和對象以及java其他獨有的語言特性,和最重要的特性——面向對象。面向對象為我們帶來了各個方面的好處,使程式易了解、易維護、易擴充、品質高。

目錄

老王的JAVA基礎課:序言

老王的JAVA基礎課:第1課 計算機基礎知識

老王的JAVA基礎課:第2課 JDK安裝和環境變量配置

老王的JAVA基礎課:第3課 IDEA的安裝和使用

老王的JAVA基礎課:第4課 以hello world學習基礎文法

其他文章

2020年高效搬磚必備的IDEA插件(附安裝包)

詳解從p12證書提取RSA公私鑰和序列号(小白向)

本教程同時釋出在我的公衆号:Java學步園,歡迎加入JAVA初級交流群:757443185,滑到最上面左側掃描二維碼哦~