物件導向
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