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

封裝

精神:

隱藏內部屬性 (設成 private)

利用其他方法來修改 (set)、獲取 (get)

 

DRY principle

避免程式碼重複,所以要更改屬性統一用 set

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