物件導向
Object-oriented programming中國翻為"面向對象",台灣則翻為物件導向
我個人也覺得"物件導向"翻的比較信雅達,可以參考這篇知乎問答的解釋
概念
首先用咖啡機煮咖啡為例:
過程導向(Process-oriented)
過程導向強調的是功能行為,以函數為最小單位,考慮如何做
- 
執行加咖啡豆方法
 - 
執行加水方法
 - 
執行煮咖啡方法
 - 
執行喝咖啡方法
 
物件導向(Object-oriented)
物件導向則是先將功能封裝進物件,強調具備功能的物件,以類/物件為最小單位,考慮誰來做
在執行煮咖啡操作前要抽象出:人和咖啡機(分類),然後開始執行:
- 
人.加咖啡豆
 - 
人.加水
 - 
咖啡機.煮
 - 
人.喝咖啡
 
物件導向的三大特徵
- 封裝(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為線程共享,在類加載階段就實例化,放在方法區
 - 局部變量:放在棧
 
權限修飾符
封裝時會用到
- 屬性:可以在聲明時修飾權限,常見的有
private、public、protected、缺省 - 局部變量:只允許使用
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中我們把功能、結構都封裝到類中,通過類的實例化來調用具體的功能
類與物件的操作順序
- 創建類,定義屬性、方法
 - 類的實例化(new一個該類的物件)
 - 調用物件的結構(物件.屬性、物件.方法)
 
上次修改於 2021-11-23