取自 JAVA由初學邁向認證
範例 Chap5 DefineClass2
public class DefineClass2 {
public static void main(String[] args){
Vehicle newCar1 = new Vehicle(); //實體化一個物件
Vehicle newCar2 = new Vehicle(); //再實體化另一個物件
Vehicle rCar; //只是一個參考
rCar = newCar1; //rCar指向newCar1
newCar1.wheel = 4; //指定實體變數的值
newCar2.wheel = 8;
rCar.wheel = 6; //現在,newCar1的值也會更改
System.out.println("newCar1車子有 " + newCar1.wheel + " 個輪子");
System.out.println("newCar2車子有 " + newCar2.wheel + " 個輪子");
}
}
class Vehicle{ //定義的類別
int wheel; //定義一個實體變數
}
上面是附在光碟中的 code, 但是在我使用 Eclipse 編譯照抄時卻出現錯誤。
除了我不小心把 code 包到 main{}裏頭之外額外發現了其他寫法。
下面是我寫錯的程式段:
main{
class Vehicle{ //定義的類別
int wheel; //定義一個實體變數
}
}
說法一:
這是因為在 main {} 裏頭 Vehicle 是一個 動態 的內部類別,創建這樣的對象必須有實體與之對應,
程式是在靜態方法中直接調用動態內部類別所以會報出這樣錯誤。
這樣的錯誤好比類中的"靜態方法(static method)"不能直接調用動態方法。
所以可以把該內部類聲明為 static ,或者不要在靜態方法中調用他。
那麼......為啥非靜態方法不能調用動態方法呢?
從面向對象(ex: 物件)的角度來說,動態方法與對象(物件)是聯繫密切的,
比如:「發動」 是一個方法(method),它與「汽車」這個對象(物件)是關聯的,
所以只有 new 了汽車這個對象才能執行 汽車.發動
說法二:
內部類別實體依存於外部類別實體;
外部類別的靜態方法可以直接被調用,而不需要 new 外部類別實體;
所以在外部類別的靜態方法中直接實體化內部類別就會出現這個編譯錯誤。
上面是我在網路上看到關於錯誤的部分說明將之整理後的解釋。
所以我把 code 改成如下:
public class DefineClass2 {
//public int Vehicle;
public static void main(String args[])
{
class Vehicle // 定義類別
{
int wheel; // 定義一個實體變數
}
Vehicle newCar1 = new Vehicle(); // 實體化類別中物件
Vehicle newCar2 = new Vehicle(); // 同上
//「什麼是物件?」
// 物件是可以視為同一單位的程式碼和資料的組合。
// 物件可以是應用程式的一個片段,例如控制項或表單。
// 整個應用程式也可以是個物件。
//「什麼是變數?」
// 簡單的說,就是讓某一個特定字串代表不固定的內容就是了。
// 舉個大家在國中都會學到的數學例子,
那就是:『 y = ax + b 』這東西。
// 在等號左邊的(y)就是變數,在等號右邊的(ax+b)就是變數內容。
// 要注意的是,左邊是未知數,右邊是已知數喔!
// 講的更簡單一點,我們可以『用一個簡單的 "字眼"
來取代另一個比較複雜或者是容易變動的資料』。
// 這有什麼好處啊?最大的好處就是『方便!』。
Vehicle rCar; // 參考
rCar = newCar1; // rCar 指向 newCar1
newCar1.wheel = 4; // 指定一個值 給予 實體變數
newCar2.wheel = 8; // 同上
rCar.wheel = 6; // 因為 rCar 指向 newCar1 所以這裡會讓"6"取代前兩行所指定的值 = > "4"
System.out.println("newCar1 has " + newCar1.wheel + " tires.");
System.out.println("newCar2 has " + newCar2.wheel + " tires.");
}
}
沒有留言:
張貼留言