03_Java物件導向(一)
Huang Po-Hsuan
105.07.15
只整理易出錯或小重點,並非教學
共享
用 static 修飾屬性:
- 屬性不屬於物件,而是類別
- 又稱靜態成員,所有物件共享
- UML 表示:加上底線
用 static 修飾方法:
- 屬於類別,又稱靜態方法
- 可以不建立物件直接呼叫
若類別的屬性跟方法全都是靜態 (有 static)
則通常沒有建立物件的必要
技巧:可以把建構式設成 private (無法 new)
其它重點:
靜態方法不可以操作非靜態屬性
方法中不可定義靜態屬性
方法內不可再定義其它方法
Constructor (建構子,簡稱 ctor)
宣告:
- 沒有傳回值 (不是 void)
- 名稱與類別名稱同
- 詳細用法之後繼承有範例
若沒有另外宣告會自動產生預設建構子
預設建構子沒有任何參數
is-a v.s. has-a
交通工具
汽車
-天窗
-輪胎
is-a
has-a
is-a
(a kind of ...)
1. Generalization:
- 一般化 (父、子)
- 子 父
- 語法:extends (詳細用法之後繼承有範例)
2. Realization:
- 實作 (Implements)
- A B (B實作A的功能,之後介面再說)
has-a
(part of ...)
1. Aggregation:
- 聚合
- 天窗 汽車 (汽車不一定要有天窗)
2. Composition:
- 組合(結合)
- 輪胎 汽車 (汽車一定要有輪胎)
繼承
無多重繼承 (和 C++ 不同)
決定權在子類別
父的屬性、方法、ctor 設成 private 就不會被繼承
語法:extends (更像延伸的概念)
父
子A
子B
左圖
右圖
父
子
明確繼承:
- 有寫出 extends 誰
隱含繼承:
- 若沒寫,則預設繼承 Object
- 編譯器自動加上 extends Object
- 所以所有物件的第一代都是 Object
public class ExtendsTest {
public static void main(String[] args){
Son son = new Son();//呼叫子類別ctor前會先呼叫父類別的ctor
son.fatherMethod();//使用從父類別繼承到的方法
}
}
class Father{//隱含繼承 Object
public Father(){
System.out.println("Father's ctor");
}
public void fatherMethod(){
System.out.println("Father's method");
}
}
class Son extends Father{//繼承語法
public Son(){
System.out.println("Son's ctor");
}
}
run:
Father's ctor
Son's ctor
Father's method
vararg (變長參數)
public class VarargTest {
public static void main(String[] args){
int num = VarargTest.addAll(1,2,3,4);//不管參數幾個都可
System.out.println(num);
}
public static int addAll(int... n){
int sum = 0;
for(int i:n){
sum += i;
}
return sum;
}
}
一個方法中最多只能一個,且一定是放在最後一個
呼叫時可以不傳參數
run:
10
封裝
public class SetGetTest {
public static void main(String[] args){
Account account = new Account(100);
System.out.println(account.getMoney());
}
}
class Account{
Account(int init_money){//ctor
setMoney(init_money);//DRY principle
}
public void setMoney(int money){//set
_money = money;
}
public int getMoney(){//get
return _money;
}
private int _money;
}
run:
100