星期五, 2月 23, 2007

轉換

只會C++而盲然的寫Java是一件很危險的事,至少就我今天簡單的寫作中體會到非常多。

以我自己寫的而例。

class UnitBlock{/*.....*/};
UnitBlock[][] u =new UnitBlock[BombSolution.X+2][BombSolution.Y+2];

這樣子,還是不能使用的,因為根據說法,這樣子充其量只是array of array of reference,根本沒有物件被產生。如果使用會有Exception產生(只學過C++的我第一次就卡在這裡),所以得加入

for(int i=0;i<u.length;i++){
for(int j=0;j<u[i].length;j++) u[i][j] = new UnitBlock();
}

讓每個reference完成指向new所創造的物件上,我不甚聰明,今天就卡在這個問題上。

另外的想法,Java 的class method 本身的傳值方式為 pass by value ,所謂的pass by reference,是因為Java本身的object在利用new做分配時,就是reference,所以做為傳遞時,也是傳遞reference(也就是說reference本身就是該object的value)。這點跟我原本預先Java為pass by reference 相差甚遠。

當然,自己第一次寫的時候,也發現一個有趣技法,宣告一個class,class method皆為static, 那麼這些class static method,在還沒有任何object被建立時,就已經實作之,這樣子很像C++ 的namespace 的技法(當然C++ class要這樣子做也是可以的)。只是和Josh一討論,發現這不是什麼了不起的技法,Java 的整個Math都是只有class static method,討論之後才得知,事實可以。

class BombSolution{
private BombSolution(){};
}
把defaule constructor為private,使得任何物件無法為之產生,我不得不說,好方法,而且把我思考的這個技法發揮到一種美麗的境界。

事實上還有很多白癡錯誤,但是從C++ 跳Java 還是一個很有趣的過程

---
感謝今天容忍我的聊天一直lag

張貼留言