物件導向:基本概念與學習路線
尚硅谷JavaSE筆記-08

物件導向

Object-oriented programming中國翻為"面向對象",台灣則翻為物件導向

我個人也覺得"物件導向"翻的比較信雅達,可以參考這篇知乎問答的解釋

https://www.zhihu.com/question/22515658/answer/120754062

概念

首先用咖啡機煮咖啡為例:

過程導向(Process-oriented)

過程導向強調的是功能行為,以函數為最小單位,考慮如何做

  1. 執行加咖啡豆方法

  2. 執行加水方法

  3. 執行煮咖啡方法

  4. 執行喝咖啡方法

物件導向(Object-oriented)

物件導向則是先將功能封裝進物件,強調具備功能的物件,以類/物件為最小單位,考慮誰來做

在執行煮咖啡操作前要抽象出:人和咖啡機(分類),然後開始執行:

  1. 人.加咖啡豆

  2. 人.加水

  3. 咖啡機.煮

  4. 人.喝咖啡

物件導向的三大特徵

  • 封裝(Encapsulation)
  • 繼承(Inheritance)
  • 多態(Polymorphism)

類和實例

類(class):抽象的模板、概念上的定義

物件(object):是實際存在的個體,也稱為實例(Instance)

比如說有輪子、吃汽油跑的是汽車類。小弟的車new march則為實例

類的設計

設計類其實就是設計類的成員

屬性(field):成員變量,又稱域、字段、欄位

行為(method):成員方法,又稱函數

舉例:汽車類的屬性有輪子大小、有品牌名稱;汽車的行為有吃汽油跑

練習-在JAVA創建類並實例化

class Car {
    // 屬性
    String brand;
    String owner;
    boolean isNew = true; // 可以給預設值

    // 行為(方法)
    public void crash() {
        if (isNew) {
            System.out.println(owner + "新買的" + brand + "出車禍,很嘔");
        } else {
            System.out.println("老車,撞就撞了");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 實例化
        car c1 = new Car();
        c1.owner = "小弟";
        c1.brand = "march";

        // 調用
        c1.crash();
    }
}

屬性(成員變量)與局部變量的差異

聲明的位置
  • 屬性:直接放在類的一對{}
  • 局部變量:聲明在方法、方法形餐、代碼塊、構造器形參、構造器內部的變量
記憶體中位置
  • 屬性:對於非static的屬性,放在堆。
    • static為線程共享,在類加載階段就實例化,放在方法區
  • 局部變量:放在棧
權限修飾符

封裝時會用到

  • 屬性:可以在聲明時修飾權限,常見的有privatepublicprotected、缺省
  • 局部變量:只允許使用final
預設初始化狀態
  • 屬性:根據其類型有對應的預設值,也可以在聲明時自定義
  • 局部變量:沒有預設初始化值,調用之前一定要顯示賦值,否則報錯。
    • 形參則是調用時賦值即可

方法的聲明與使用

方法:描述類應該具有的功能,例如:狗類會汪汪叫

聲明格式

方法名是標示符,依規範用小駝峰(舉例:touchCat)表示

權限修飾符 返回值類型 方法名(形參列表){
//方法體
}
舉例:public void sleep(int hour){} // void=無返回值
權限修飾符
  • 常見的4種為private、public、protected、缺省
  • 進階的有static、final、abstract後面封裝時再講
返回值與形參

有沒有返回值跟形參,要看具體情境判斷

  • 如果有返回值,必須在聲明時指定返回值的類型,且方法中必須使用"return 數據“返回該類型的變量或常量。

  • 若沒有返回值,聲明時用void,通常就不用return;也可以用,但只能純”return“表示結束方法

  • 可以聲明0或多個形參,格式:數據類型1 形參1,數據類型2 形參2,…

使用注意
  • 方法中可以調用當前類的屬性或其他方法
  • 也可以調用自己(遞歸調用),但切記要能閉合而不是造成無限循環
  • 方法中不能再定義方法

練習-建立一個學生類的數組

創建一個學生類,包含學號1~20、隨機的年級與成績,用數組表示

public class Main {
    public static void main(String[] args) {
        Student[] stus = new Student[20];
        for (int i = 0; i < 20; i++) {
            stus[i] = new Student(); // 相當於給數組中的每個元素賦值
            stus[i].number = i + 1;
            stus[i].state = (int) (Math.random() * 6 + 1);
            stus[i].score = (int) (Math.random() * 101);
        }
        for (int i = 0; i < stus.length; i++) {
            System.out.println("學號" + stus[i].number + ",年級是" + stus[i].state + ",成績是" + stus[i].score);
        }
    }
}

class Student {
    int number;
    int state;
    int score;
}

重點:new了數組stus後,其中每一個物件stus[n]也都需要new才能使用

匿名物件

一次性使用

new 類名.欲調用的屬性或方法
或在參數中直接new Circle()調用一個預設的類的實例

小結

學習物件導向的三條主線

  • 類及類的成員:屬性、方法、構造器;代碼塊、內部類
  • 物件導向特徵:封裝、繼承、多態、抽象
  • 其他關鍵字:this、super、abstract、interface、static、final、package、import

一切都是物件

在JAVA中我們把功能、結構都封裝到類中,通過類的實例化來調用具體的功能

類與物件的操作順序

  1. 創建類,定義屬性、方法
  2. 類的實例化(new一個該類的物件)
  3. 調用物件的結構(物件.屬性、物件.方法)

上次修改於 2021-11-23