| Java |
C#
|
|
| 主類名與文件名 |
必須一致 |
可以不一致 |
| 命名空間導入方式 |
import關鍵字 |
using關鍵字 |
| 常量 |
final關鍵字 |
Const關鍵字 |
| 基本數據類型 |
C#中有無符號數,Java沒有。 注: 可以為 null 的類型是 System.Nullable<T> 結構的實例。 可以為 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()的方式實例化泛型,等。 |
C#的泛型在類型參數傳入類型后會產生一個新類型(雖然CLR的優化機制會使引用類型共享同樣的代碼),可以在運行時得到類型參數的類型信息。可以定義泛型數組,可以添加約束使其可以new。C#的泛型可以使用值類型(不會被裝箱)。 |
| 參數引用傳遞 |
只有值傳遞 |
使用關鍵字ref:迫使值參數通過引用傳遞給方法;
使用關鍵字out:在參數未初始化的情況下,在一個函數中輸出多個值;
使用關鍵字params:自動把參數轉為數組; |
| Ref: 當控制權傳遞回調用方法時,在方法中對參數的任何更改都將反映在該變量中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
Out: out 關鍵字會導致參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變量必須在傳遞之前進行初始化。 |
||
