C#和JAVA的相同點和不同點
C#與JAVA的相同之處:由于C#與JAVA都是基于C++發展起來的,是以二者之間具有很多相似之處,具體如下:
1、C#和JAVA語言的編譯結果是獨立于計算機和程式設計語言的,可執行檔案可以在受管理的執行
環境中執行;
2、C#和JAVA語言都是采用了自動的垃圾回收機制;
3、C#和JAVA語言都取消了指針操作;
4、C#和JAVA語言都沒有頭檔案;
5、C#和JAVA語言都隻支援單重繼承,要實作與多重繼承類似的功能,必須通過接口來實作;
6、類都是從Object類派生而來,類的對象通過關鍵字new生成;
7、C#和JAVA語言都支援線程;
8、C#和JAVA語言都沒有全局變量和全局函數,所有的變量和函數都屬于某個類所有;
9、C#和JAVA語言都支援對數組和字元串邊界的嚴格檢查,不會出現邊界溢出的情況;
10、C#和JAVA語言都使用“.”操作符,不再使用“->”和“::”操作符;
11、C#和JAVA語言都将null和bool作為關鍵字;
12、C#和JAVA語言中所有的值都必須先初始化後才能使用;
13、C#和JAVA語言中的if語句都不允許采用整數作為判斷條件;
14、C#和JAVA語言中的try語句塊都可以後接finally語句塊。
C#與JAVA的不同之處:
盡管C#和JAVA有很多相同之處,但是由于二者是兩家不同公司開發的進階程式設計語言,它們又互相獨立,
自成體系,各自具有一些自己特有的特點,下面将C#與JAVA之間的不同之處如下:
1、屬性
對于那些經常使用快速開發工具,如Delphi或者Visual Basic的開發人員來說,屬性是一個非常熟悉的概念。
一般來說,通過getXXX可以讀取屬性的值,而通過setXXX可以設定屬性的值。
JAVA中比較常見的屬性操作語句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true);
c#中比較常見的屬性操作語句: foo.size++; label.font.bold=true;
很明顯,上述的屬性設定方式較JAVA來說更為簡潔,可主讀性也更強。這充分展現了C#簡單的特點。
JAVA對于屬性的定義:public int getSize(){ return size; } public void setSize(int value){ size=value; }
c#對于屬性的定義進行了簡化:public int Size{ get{ return size; } set{size=value; }}
2、index
C#提供index來給對象加上索引的功能,進而用與處理數組類似的方式來處理對象,JAVA語言則不支援index
C#中定義index的典型方式如下:
public Story this[int index]
{
get{return stories[index]; }
set{
if(value!=null){
stories[index]=value
}
}
3、delegate :可以認為是一種類型安全、面向對象的函數指針。
C#使有delegate可以通過一個名字通路不同的函數,它實作和JAVA中的interface類似的功能,但是它比interface更為好用。
4、event
C#提供對event的直接支援,它通過delegate和event關鍵字實作對事件的處理。event關鍵字隐藏所有delegate方法,運算符“+=”和“-+”允許程式員自由加入或者删除時間處理程式。
5、enum:枚舉用于指定一系列的對象。
C#通過如下語句來定義和使用枚舉:
定義:public enum Direction{North,East,West,South};
使用:Direction wall=Direction.North;
JAVA不直接支援枚舉,如果要實作和C#相類似的功能,必須先定義一個類
public class Direction{
public final static int NORTH=1;
public final static int EAST=2;
public final static int WEST=3;
public final static int SOUTH=4; }
在定義了Direction類後,JAVA可以通過引用類中的值來使用枚舉:
int wall= Direction.NOTRH;
6、foreach語句
C#提供了标準的for循環,同時還提供了foreach語句(從VB中引入)來循環處理集合中的元素。
JAVA周遊集合中的所有元素的典型處理方式如下:
while(!collection.isEmpty())
{
Object o=collection.get();
connection.next();
…
}
C#周遊集合中的所有元素:foreach(object o in collection){…}
7、統一資料類型:
大多數的進階程式設計語言都有基本資料類型,如整型、浮點類型等。同時,為了更好地滿足實際的需要,對不同的資料類型有不同的處理方式,顯然,如果能夠對簡單資料類型的處理和對複雜資料類型的處理結合在一起,并用一緻的方式加以處理的話,無疑會大大提升應用程式設計的效率,增強程式設計的靈活性。
JAVA語言在處理基本資料類型的時候也采取分别處理的政策,但是在基本資料類型的基礎上提供了一系列封裝這些基本資料類型的類,例如:整型(int)被類Integer所封裝,雙精度浮點(double)被類Double封裝。
C#提供了一種和JAVA不同的方式來實作資料類型的統一。事實上,在c#中,即使是int這樣的簡單資料類型在C#内部也是通過一個結構體Int32來實作的,在C#中,可以這樣認為,int隻是結構體Int32的一個别名。由于C#中的結構體也繼承自類Object,這樣,Object類中定義的方法,各個結構體也擁有,于是,在C#中可以通過如下的方式來操作整數:int I=5; System.Console.WriteLine(i.ToString());
8、操作符重載
通過操作符重載可以用一種比較自然的方式來操縱各種資料類型,進而大大提升程式的可讀性和靈活性。C#中的“==”操作符在Object類中進行了定義,在Object中定義的==操作符通過比較兩個值的引用來獲得最後的結果。如果使有和集合相關的類,則必須在這樣的類中實作ICompar接口,這個接口中定義了一個方法CompareTo,該方法傳回兩個對象的比較結果,在此基礎上,可以進一步定義各個實作比較的操作符,如
“>”、“<”、“>=”、“<=”等。事實上,數字類型(int、long等)可以直接使用這些比較操作符,它們的内部都實作了ICompare接口。
9、多态性
虛似方法提供了多态性的技持。多态意味着派生類可以定義一個和基類中同名的方法。盡管JAVA和C#都支援多态性,但是它們的具體實作方式還是有一定的差别。
在JAVA語言中,預設情況下,基類的對象可以直接調用派生類中的虛似方法,在C#語言中,基類要調用派生類中的虛似方法必須通過virtual關鍵字來實作。同時,在C#語言中,一個方法要重載基類中的同名方法,還必須通過關鍵字override來實作。在C#中實作多态的典型程式如下:
Class B{ public virtual void foo{}}
Class D:B{ public overried void foo(){}}