Java學習記事

最近抽空學Java,一開始以為跟C#是差不多的語言,不過實際學下去發現到,還是有不少觀念是不相同的。

最近抽空學Java,一開始以為跟C#是差不多的語言,不過實際學下去發現到,還是有不少觀念是不相同的。

 

1.      Integerint的差別。

Java當中以int宣告的變數和Integer宣告的變數是不同的,Integer型別的變數是屬於參考型別,而int型別變數是實值型別,但是在C#之中,則沒有這個分別。

2.      ==運算子和Equals函式。

Java當中字串的比對需要特別的注意,==Equals的結果是不同的,在C#當中,則相同。

3.      泛型。

Java現在也支援泛型,不過感覺支援度並不如C#Java不能定義泛型方法。

4.      函式參數。

C#當中,可以使用Delegate來包裝Function成為參數,不過Java沒有Delegate,更沒有Function Point,在Java當中是以介面來實作這方面的功能。

 

讓我覺得比較不習慣的有,在Java的世界中,==是用來比較變數的參考是否為同一個物件,所以變數內容的比較是要使用Equals函式來做比較,而C#中,==就只是一個運算子,會有什麼功能,是看物件對於這個運算子的定義。

 

C#推出泛型的時候,我就有注意到Java也推出了泛型,因為想要接觸這個相似的語言如果實作這些語法的特性,才會驅使我去學習JavaJava的泛型實作上跟C#差不多,限制也差不多,不過,Java不能使用泛型方法這點讓我覺得有點可惜,可能也是我不知道怎麼實作的關係。

 

讓我感到有趣的是,Java的方法參數化的方式,Java需要使用介面來包裝要傳遞的方法,像Thread的實作上,就需要使用Runable介面來達成功能,不過,如果單單這樣的話,可以說是相當難用,這時候就使用上了一個C#所沒有的特性,在C#中,介面是不能使用new來建構物件的,但是Java可以利用new來實作一個沒有名字的物件,並且擁有該介面的特性。

 

這樣的感覺,有點像C#的匿名函式,使用上還蠻新奇的,另外,曾經看過Java也打算加入FP的功能,打算之後也來看看Java如果實作這樣的功能,也有可能讓Java有像匿名函式這類的功能。

 

Java在定義類別的時候,也有些和C#不同的地方,Java沒有override關鍵字,反之,Javafinal關鍵字,也就是說,Java預設定義的方法都是virtual的,而在子類別中定義的同樣簽名的函式即為override,如果不想要讓子類別override的方法,則需要標示為final

 

不同的語言在設計之初,總有些不同的理念,而這些理念會表現在這些語言的特性之中,雖然我感覺,這樣學下去,可能會發生語言錯亂,不過就多學一項程式語言的感覺而言,還不賴,蠻新奇的。