Re: [問題] C#轉學Java

看板java作者 (LaPass)時間14年前 (2011/10/15 23:16), 編輯推噓8(808)
留言16則, 11人參與, 最新討論串2/4 (看更多)
Java當初的設計理念是簡單、安全 也因此可以很快上手,但也因此少掉很多在C++中好用以及麻煩的東西 Java SE6技術手冊,我一個禮拜就看完了 這是一本很好的上手書 實際上也只有半本(CH13前)的部分屬於必需看過的部分 剩下的Stream、Thread、Reflection、Annotation,等要用到時再去查 如果打算走Android,Reflection那部分最好稍微看過 Android常常用Reflection去調用apk裡的東西 但也建議你留一本Thinking in JAVA在身邊 Thinking in JAVA講的比較深,有時候遇到一些問題 去找Thinking in JAVA比較能獲得清楚的解答 C#的概念是模仿Java,但寫起來比較像C++ 像指標、函數指標、多載運算子、goto等東西,C#有保留下來 但在Java中全部都被沒收了 少了那些複雜的東西,所以能學的很快 C#的關鍵字比Java多很多 相較之下Java簡單輕快,只要知道那些缺少的東西要怎麼去轉換 就能寫得很順 在基礎語法方面 像 goto XXX; XXX: 這種東西在Java中被 break XXX; continum XXX; 取代 例如: XXX: { break XXX; } 而且只能往後跳,不能往前跳 如果要往前,只能用while等迴圈去控制程式流程 foreach 在Java中的型式是 for (iterable_type iterable_element : iterable) 修飾詞 (private、public、protected) 在C#中只有三種,如果沒加,就會變成private 在Java中如果不加修飾詞,代表的是同一套件內的成員都能使用他 Java跟C#的類別配置不太一樣 C#用namespace去區別class的「域」 而檔案跟程式碼沒直接關係 但Java是用套件區分,而且一個.java檔案只能放一個public class 且檔案名稱需與類別名稱同名 不像C#愛放哪裡就放哪裡,嫌class太大還能用partial class拆成兩三個檔案 還有, C#可以為現成的class亂加方法進去,例如: static class Util { public static int Square (this int i ){return i*i}; } int x = 100; x = x.Square(); //x == 10000 java沒這種東西,如果想擴充,只能繼承它 不過,C#中因為有struct才比較需要這樣做 但Java中都是物件,就不需要 覆寫(Override) 在C#中要宣告override才准繼承的成員去覆寫 但是Java中只要直接覆寫即可 Method前面的 @Override 只是給編譯器看的,不加也沒事 多載運算子 C#可以為自定的類別宣告轉型運算子、算術運算子 但在Java中.... 沒辦法,請把這個功能忘了 只能寫個Method去轉型、去相加、去相減 指標 在C#中的ref、out是在Method中用來取代指標的功能 在Java中也沒有 不過,我看過個寫法是,把變數放進陣列,把陣列傳進Method 硬是把算完的東西用陣列帶出來 Java容器物件都在java.util底下 跟C#差異不會很大,只是名稱不一樣 若要說比較大的差異...... 像是C#中是用 List<int>,但是在Java裡面只能用List<Integer> 而且會經過boxing、unboxing 在名稱方面,在C#中允許 interface A<T1>{} interface A<T1,T2>{} 這種同名泛型,但是在Java中不允許 以及,在C#中遇到必須同時繼承兩個介面時 例如: interface A{void A();} interface B{int A();} 在C#中可以用 void A.A(){} int B.A(){return 0;} 的方式去區別兩個函式是繼承自哪個介面 Java沒這種東西,理由是:基於Java的特性,根本不需要 當初也覺得撞名很嚴重,但在Java有自己的解決辦法 這等一下講 C#有delegate、event這種類似函數指標的東西 在Java中沒有 C#中常常經過委派去設定按鍵、鍵盤事件 在Java中是用另一方式 這也等一下講 要說Java中比較特別的東西 就是Inner class C#雖然也有,但C#的Inner class就沒有像Java中的那樣好用 C#比較像是「把一個class放進一個跟上層class同名的namespace裡面」 上層class跟Inner class沒有直接關係 感覺很雞肋,我寫C#時幾乎沒用過 除非是用static class來紀錄一些全域變數 (有分層比較不會搞混) 但Java中,Inner class卻像是「上層class 的一部份」 他本身會隱含上層class的參照 這特性被用來處理很多事 舉例來說: class A { void A(){} class B { void Method1() { A(); //在C#中不會過,但Java中可以 } } } 也因為如此,在java中常常這樣用 class A { class B implements View.OnClickListener() { @Override public void onClick(View v) { } } class C implements Button.OnClickListener() { @Override public void onClick(View v) { } } } 這樣一來,就能避免interface中的Method撞名的問題 而且onClick裡面的程式碼也可以自由使用class A裡的欄位、Method 以及,之前在C#中常常用委派(delegate)設定一些點擊、按鍵事件 那時是直接塞方法名稱就可以,例如: class C { public void onClickEevent() { //點下Button時要做的事 } } 設定時: Button.OnClick = onClickEevent; <=把Method放進delegate 但在Java中的做法是這樣: class C { class OnClickEvent implements Button.OnClickListener() { @Override public void onClick(View v) { //點下Button時要做的事 } } } 設定時: Button.setOnClickListener(new OnClickEvent()); 其他Java的SDK我不知道是怎麼設計 但是在Android SDK裡,設定某個條件觸發某個狀況,都是這樣寫 ※ 引述《wa007123456 (大笨羊)》之銘言: : 大家好! : 我以前是用C#當作我的主要語言 : 最近看見Android的聲勢越來越大 : 想要也把Java學起來 去開發移動式裝置 : 雖然Visual Studio C# Express : 這個IDE真的"超級"好用 當初我也這樣覺得 但是Eclipse只是調整起來麻煩 很多東西都要手動去調整 用熟後就會變得超好用,因為幾乎什麼都可以調 現在我的Eclipse只要我打個字首 就會跟Visual Studio C# Express一樣跳出候選字清單出來 那個從 視窗/喜好設定 那可以調整 還有,Eclipse開放給別人寫外掛 所以只要加裝一些東西,馬上就能寫C++ php等不同語言 這點比Visual Studio強大太多了 : 還有大量的msdn文件資料 http://nothing.tw/JDK_API_1_6/ 中文java doc文件在這裡 : 但是他只能開發Windows Phone : 我現在Java的IDE是Eclipse : 但是覺得他並不夠人性化 : 速度也略慢 : 我知道Java跟C#很類似 : 不過還是有其差別存在 : 像是繼承的語法就不同 : 我買了一本Java的書 : 可能是太基礎吧? : 我翻一翻就感覺念完了@@ : 但是實際去寫後 : 又覺得力不從心 : 感覺就是怪怪的 : 我想請問C#轉Java應該要注意的事項? : 感謝有經驗的大大分享 : 小弟在此感謝! 除非打算深入研究Java 否則,在使用上,Java真的簡潔成這個樣子 Java寫起來一點也不花俏,不用去記一些奇奇怪怪的寫法 用最單純的寫法就對了 如果覺得寫起來很卡、力不從心 那就去找找網路 大概看一陣子範例,就知道Java style的寫法是怎麼樣 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.233.152.117

10/15 23:43, , 1F
補一個 c#的 int x{get; set;} 在Java中要用Method去寫
10/15 23:43, 1F
例如: int getx(){return x;}; void setx(int x){this.x = x;} ※ 編輯: LaPass 來自: 125.233.152.117 (10/15 23:49)

10/16 00:27, , 2F
VS也有開放寫擴充工具.........
10/16 00:27, 2F

10/16 09:31, , 3F
推這篇的字數,不過,還是那句話:請忘掉你寫過 C#
10/16 09:31, 3F

10/16 13:36, , 4F
看不懂inner class的例子...orz
10/16 13:36, 4F
※ 編輯: LaPass 來自: 125.233.155.247 (10/16 13:43)

10/16 13:43, , 5F
打太快少打一層 = =|||
10/16 13:43, 5F

10/16 14:07, , 6F
那在實驗室被要求寫一些JAVA作業,但是對於C和JAVA都不
10/16 14:07, 6F

10/16 14:08, , 7F
熟悉的話,請問有甚麼好的推薦?買書重K嗎??
10/16 14:08, 7F

10/16 14:13, , 8F
書到用時方恨少
10/16 14:13, 8F

10/16 14:14, , 9F
這篇寫得很棒啊,大學生們可能會拿去當作作業的解答了XD
10/16 14:14, 9F

10/16 14:46, , 10F
要速成的話去看 Java官網的Tutorial 吧
10/16 14:46, 10F

10/16 14:49, , 11F
10/16 14:49, 11F

10/16 19:20, , 12F
謝謝你^^ 我在好多地方都有看見你@@ 你應該是程式達人
10/16 19:20, 12F

10/16 20:15, , 13F
我不強,只是常常po文問問題而已....
10/16 20:15, 13F

10/17 01:16, , 14F
C#好像就是Java變來的?
10/17 01:16, 14F

10/17 08:39, , 15F
微軟原本想買下Java,結果沒買成,就自己生一個C#出來。
10/17 08:39, 15F

10/23 18:48, , 16F
你最後講的C# delegate和setListener 是不一樣的東西
10/23 18:48, 16F
文章代碼(AID): #1EcQFN41 (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 4 篇):
文章代碼(AID): #1EcQFN41 (java)