1. 程式人生 > >Java與C#的區別

Java與C#的區別

原資源地址:http://www.cnblogs.com/suinuaner/archive/2013/03/01/five.html

1.屬性(成員變數): 
java中定義和訪問均要用get和set方法,可以不成對出現。 
c#中是真正的屬性,定義時get和set必須同時出現,訪問時用.號即可。不用get,set 

2、Java中的介面可以包含常量(儘量不要這麼用),而C#中的介面不可以包含常量

3、
4.因為JAVA規定,在一個檔案中只能有一個public類,而且這個類的名稱必須與檔名一模一樣,這是一個區別 

5.在C#中,它是以Main方法來定位入口的.如果一個程式中沒有一個名為Main的方法,就會出"找不到入口的錯誤".不要把Main寫成main喲 

公用類的入口點:c#是可以對Main進行過載(java中是main),允許有int返回值和空引數的Main,也可以是private的,甚至可以是protected的。Java中的main函式必須是public  static  void  main(String[] args)

6.C#預定義的簡單資料型別比Java多。例如,C#有unit,即無符號整數 

7.忘掉Java中的static final修飾符。在C#中,常量可以用const關鍵詞宣告常量
C#的設計者還增加了readonly關鍵詞,readonly域只能通過初始化器或類的建構函式設定初值 ,並且被動態賦值一次之後就不能再改了。

由於C#中不存在final關鍵詞,如果想要某個類不再被派生,你可以使用sealed關鍵詞

9.在Java中,switch語句只能處理整數。但C#中的switch語句不同,它還能夠處理字元變數。請考慮下面用switch語句處理字串變數的C#程式碼 

10.C#沒有>>>移位操作符 

11.goto關鍵詞: 
Java不用goto關鍵詞。在C#中,goto允許你轉到指定的標籤。不過,C#以特別謹慎的態度對待goto,比如它不允許goto轉入到語句塊的內部。在Java中,你可以用帶標籤的語句加上break或continue取代C#中的goto。 

12.int[] x = { 0, 1, 2, 3 }; 
int x[] = { 0, 1, 2, 3 }; 
但在C#中,只有第一行程式碼合法,[]不能放到變數名字之後。 

13.與Java不同的是,C#允許為名稱空間或者名稱空間中的類指定別名: 
using TheConsole = System.Console; 

14.在Java中,包的名字同時也是實際存在的實體,它決定了放置.java檔案的目錄結構。在C#中,物理的包和邏輯的名稱之間是完全分離的 
.NET中包的實體稱為程式集(Assembly)。每一個程式集包含一個manifest結構。manifest列舉程式集所包含的檔案,控制哪些型別和資源被顯露到程式集之外,並把對這些型別和資源的引用對映到包含這些型別與資源的檔案。程式集是自包含的,一個程式集可以放置到單一的檔案之內,也可以分割成多個檔案。.NET的這種封裝機制解決了DLL檔案所面臨的問題,即臭名昭著的DLL Hell問題。 

15.在Java中,java.lang包是預設的包,C#中不存在預設的包 

16.C#中的訪問修飾符與Java中的基本對應,但多出了一個internal,少了一個修飾符(default)。C#中,不用任何範圍修飾符時,預設的是protect,因而不能在類外被訪問。簡而言之,C#有5種類型的可訪問性,如下所示: 

public:成員可以從任何程式碼訪問。 
protected:成員只能從派生類訪問。 
internal:成員只能從同一程式集的內部訪問。 
protected internal:成員只能從同一程式集內的派生類訪問。 
private:成員只能在當前類的內部訪問。 

18.與Java不同,C#中的介面不能包含域(Field)。 
另外還要注意,在C#中,介面內的所有方法預設都是公用方法。在Java中,方法宣告可以帶有public修飾符(即使這並非必要),但在C#中,顯式為介面的方法指定public修飾符是非法的。 

19.C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來測試某個物件的例項是否屬於特定的型別。

在Java中沒有與C#中的as操作符等價的操作符。as操作符與is操作符非常相似,但它更富有“進取心”:如果型別正確的話,as操作符會嘗試把被測試的物件引用轉換成目標型別;否則,它把變數引用設定成null。 

C#中要比較兩個引用變數是否指向同一個物件,不能用Java中的==,而要用Object裡的ReferenceEquals方法。所以Java中的object1==object2,在C#中應該是Object. ReferenceEquals(object1,object2).所以是操作符過載惹的禍,Equals就是Equals,ReferenceEquals就是ReferenceEquals。但是==,有的時候是Equals,有的時候是ReferenceEquals。==別過載了,為避免犯錯,還是稍微費點事寫Equals或ReferenceEquals,既不會犯錯,又意義清晰。

C#中,不能用一個類的例項去呼叫該類的類方法(也就是static方法),只能用類名.方法名,而Java就可以用類的例項去呼叫該類的類方法。

20.C#仍舊保留了C++的記憶體手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的 

21.在C#中,所有的異常都從一個名為Exception的類派生 

22.列舉器即enum型別(java無),把它作為一個變數值的型別使用,從而把變數可能的取值範圍限制為列舉器中出現的值。 

23.結構(Struct)與類很相似,而結構是一種值型別,它儲存在棧中或者是嵌入式的,結構可以實現介面,可以象類一樣擁有成員,但結構不支援繼承 

25.傳值方式: 
在java中簡單資料型別的值傳參時,都以傳值方式; 
在c#中如果加ref則會以引用的方式傳值(方法內部改變該引數,則外部變數一起跟著變); 
加out與ref基本相同,但out不要求引數一定要初始化. 

26.c#保留了指標。unsafe 

27.代理:代理(delegate)可以看作C++或者其他語言中的函式指標 
代理用來封裝可呼叫方法。你可以在類裡面編寫方法並在該方法上建立代理,此後這個代理就可以被傳遞到第二個方法。這樣,第二個方法就可以呼叫第一個方法。 
代理是從公共基類System.Delegate派生的引用型別。定義和使用代理包括三個步驟:宣告,建立例項,呼叫。代理用delegate宣告語法宣告。 

28、C#中有static constructor的概念,這跟Java中的靜態初始模組一樣

     Java: static{}

     C#:  static [類名]{}

29、Java在繼承、多型方面比C#強多了。Java預設的多型,C#要求加上virtual(被繼承的方法)和override(繼承的方法),而且C#要求不能改變原來的訪問修飾符,不像Java那樣,可以指定更加寬鬆的訪問方式。如果用C#寫程式,必須記住帶上virtual和override,還必須照抄原來的方位修飾符。

C#這樣做的好處:如果類B繼承了類A,B接下來添加了一個新方法 Method(),這是B特有的。將來類A(假設市別人來維護的,你不能看到原始碼)突然也增加了一個方法Method()。如果B自己的Method()方法和A的Method()方法的返回值不一樣,當更新類庫A之後,可能導致程式執行錯誤或不能編譯。而C# 就很好的避免了這一問題,雖然這種問題出現的概率很小。。。