基礎程式設計(Java)· CH8
this · 多載建構子 · 組合 · static · final · enum · 導覽地圖
完整內容看 PDF 講義,互動對照與試跑看 index。
全章主線
「共享一份」還是「各一份」決定了大半考點。
自我參照
public void setHour(int hour) {
this.hour = hour; // 左邊實例變數,右邊參數(區分同名)
}
沒遮蔽時可省略;也可 this(...) 在建構子第一行呼叫另一建構子。
建立方式
public Time() { this(0, 0, 0); } // 無引數
public Time(int h) { this(h, 0, 0); } // 一參數
public Time(int h, int m, int s) { ... } // 三參數
參數列不同即可多載。一旦自寫建構子,預設無引數建構子就消失,要自己補。
has-a
public class Employee {
private Date birthDate; // 欄位是另一個物件
}
emp.getBirthDate().getYear(); // 層層點號
組合是 has-a(A 有一個 B),不是繼承(is-a)。內含物件忘了 new → NullPointerException。
類別成員
private static int count = 0; // 類別變數,共享
public Employee() { count++; } // 每 new 一個 +1
Employee.getCount(); // 類名.方法()
static 方法不能用 this、不能直接存取實例變數(執行時可能還沒物件)。
常數
private final double radius; // 物件常數(建構子設一次)
public static final double PI = 3.14159; // 類別常數(全大寫慣例)
final 漏賦值或想二次賦值都會編譯錯。
列舉
public enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
for (Day d : Day.values())
System.out.println(d + " " + d.ordinal()); // 0 起
values() 全部常數、ordinal() 序號(0 起)、valueOf("MON") 字串轉常數。
精確金額
0.1 + 0.2 // double → 0.30000000000000004(誤差)
new BigDecimal("0.1").add(new BigDecimal("0.2")) // → 0.3(精確)
price.multiply(qty) // 用方法,不能寫 price * qty
total.setScale(2, RoundingMode.HALF_UP); // 兩位、四捨五入
double 是二進位浮點、算十進位金額有誤差。BigDecimal 用字串建構才精確,運算用 add/multiply 方法(不是 + *)。
其餘
import static java.lang.Math.*; → 直接寫 sqrt、PIfinalize 已過時,不依賴它接下來