Java&C#語法差別


 

 

Java

C#

 

主類名與文件名

必須一致

可以不一致

命名空間導入方式

import關鍵字

using關鍵字

常量

final關鍵字

Const關鍵字

基本數據類型

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> 的值包括 truefalse 或 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 要求變量必須在傳遞之前進行初始化。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com