Java&C#文法差別

來源:互聯網
上載者:User

標籤:ace   cte   obj   環境   轉換   strong   ble   功能   靜態內部類   

 

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 要求變數必須在傳遞之前進行初始化。

Java&C#文法差別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.