| |
Java |
C# |
主類名與檔案名稱 |
必須一致 |
可以不一致 |
命名空間匯入方式 |
import關鍵字 |
using關鍵字 |
常量 |
final關鍵字 |
Const關鍵字 |
基礎資料型別 (Elementary Data Type) |
C#中有無符號數,Java沒有。
C#中有實值型別,且可自己定義實值型別的結構體(struct)。 Java中的基本類型(或叫基元類型)即為實值型別,但Java沒有結構體,所以不能自訂實值型別。 C#中的實值型別(包括所有基本類型)間接繼承自Object,有自己的方法可以調用;Java中的實值型別(即基本類型)不繼承自Object,只是簡單的資料,沒有方法可以調用。
C#中int等同於System.Int32,是實值型別;bool等同於System.Boolean;等。 Java中int是基本類型,是實值型別,而Integer是參考型別,Integer是int的封裝器,int自身沒有方法,Integer有一些方法;int與Integer之間可隱式轉換(導致裝箱和拆箱),但當Integer值為null的時候會在運行時拋出異常。boolean等類似。
Java中的int與Integer的對應在C#中類似int和Nullable<int>的對應,它們的後者都是前者的封裝,且後者可以等於null。但Nullable<int>實際上仍然是實值型別的(所以仍然很輕量級),所以從記憶體上講C#中int和Object的對應更接近Java的對應一些。C#中Nullable<int>到int的轉換必須顯式進行,因為Nullable<int>中的值為null時會引發運行時異常。 其他基本類型與之類似。 注: 可為 Null 的型別是 System.Nullable<T> 結構的執行個體。 可為 Null 的型別可以表示其基礎實值型別正常範圍內的值,再加上一個 null 值。 例如,Nullable<Int32> 讀作“可以為 null 的 Int32”,可以將其賦值為 -2147483648 到 2147483647 之間的任意值,也可以將其賦值為 null 值。 可以賦給 Nullable<bool> 的值包括 true、false 或 null。 在處理資料庫和其他包含不可賦值的元素的資料類型時,將 null 賦值給數實值型別或布爾型的功能特別有用。 |
初始化 |
調用基類建構函式: SubClass(){ super(); } |
調用基類建構函式: SubClass():base(){} 或者代碼中使用base(); |
Switch語句 |
(1)只能處理int類型或者字元型 (2)每個case塊後寫break語句,不然會有穿透問題。 註:無Goto語句。 |
(1)一樣 (2)要求每一個case塊或者在塊的末尾提供一個break語句,或者用goto轉到switch內的其他case標籤。 註:最好不用,不易控制。 |
聲明數組 |
靈活。 Int[] x={1,2,3};//正確 Int x[]={1,2,3};//正確 |
Int[] x={1,2,3};//正確 Int x[]={1,2,3};//錯誤 |
物件導向 |
完全物件導向 |
相同 |
繼承 |
類的單繼承; 可以實現多個介面; |
相同 |
多態 |
支援某些形式的多態性機制 |
相同 |
重寫 |
預設方法都可被重寫,衍生類別和子類方法簽名一樣時被認為是重寫。要聲明不能被重寫的方法需在方法前加final關鍵字。重寫時可以在方法前添加標註(即C#中的定製特性)@Override,這樣一旦此方法找不到被重寫的方法時編譯器會報錯,以防止拼字錯誤。 |
被重寫的方法必須添加virtual關鍵字聲明為虛方法,衍生類別重寫子類方法時添加override關鍵字。 |
存取修飾詞 |
4類 Public:成員可以從任何代碼訪問; Protected:成員只能從衍生類別訪問; Default:預設 Private: |
Public公有訪問。不受任何限制。 Private私人訪問。只限於本類成員訪問,子類,執行個體都不能訪問 Protected保護訪問。只限於本類和子類訪問,執行個體不能訪問。 Internal內部訪問。只限於本項目內訪問,其他不能訪問。 protected internal內部保護訪問。只限於本項目或是子類訪問,其他不能訪問 |
內部類 |
內部類可以直接存取外部類的執行個體成員 |
C#的內部類不可以直接存取外部類的執行個體成員;C#的內部類等同於java的靜態內部類 |
最終類 |
final關鍵字定義的類不能再被派生 |
Seale關鍵字定義的類不能再被派生 |
介面 |
(1)關鍵字:interface; (2)介面內允許有內部類、靜態欄位等; |
(1)關鍵字:interface; (2)介面內不允許有內部類、靜態欄位等; |
記憶體管理 |
由運行時環境管理,使用垃圾收集器 |
由運行時環境管理,使用垃圾收集器 |
指標 |
完全不支援。代之以引用 |
支援,你只在很少使用的非安全模式下才支援。通常以引用取代指標 |
泛型 |
Java中泛型實現使用的擦除機制,為型別參數傳入類型並不導致新類型出現,即傳入了型別參數後在運行時仍然完全不知道型別參數的具體類型,它的目的是為了相容非泛型(所以可以在泛型和非泛型之間隱式轉換,會有編譯警告但不會有編譯錯誤,這當然其實並不安全);這同時衍生了一系列問題:不能定義泛型型別參數的數組如T[],不能通過new T()的方式執行個體化泛型,等。 Java的泛型不支援實值型別(使用的話會被自動封裝成參考型別)。 |
C#的泛型在型別參數傳入類型後會產生一個新類型(雖然CLR的最佳化機制會使參考型別共用同樣的代碼),可以在運行時得到型別參數的類型資訊。可以定義泛型數組,可以添加約束使其可以new。C#的泛型可以使用實值型別(不會被裝箱)。 |
參數引用傳遞 |
只有值傳遞 |
使用關鍵字ref:迫使值參數通過引用傳遞給方法; 使用關鍵字out:在參數未初始化的情況下,在一個函數中輸出多個值; 使用關鍵字params:自動把參數轉為數組; |
| |
|
Ref: 當控制權傳遞迴調用方法時,在方法中對參數的任何更改都將反映在該變數中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。 Out: out 關鍵字會導致參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變數必須在傳遞之前進行初始化。 |