ASP.NET基礎教程:C#與JAVA的比較
簡單地說,它們不是一種語言,語法有差別,編程時具體用到的類庫或者函數(shù)庫也不一樣。
雖然它們不是一種語言,不過它們卻也有所聯(lián)系。廣泛地說,C可以看作其他三種語言的源語言,因為其他三種語言幾乎都是從C而來的,無論從數(shù)據(jù)類型還是控制語句看,其他三種語言都有從C得來的跡象。 其中C++則一般看作是對C語言的擴展。因為C語言沒有面向對象的語法結構,而當時業(yè)界又迫切需要面向對象的編程特性,所以貝爾實驗室的開發(fā)者就為C添加了面向對象的結構?,F(xiàn)在C++已經(jīng)不只是C的擴展了,它已經(jīng)完全可以被看作一種新的編程語言。雖然C的特性以及庫函數(shù)仍然被C++支持,不過C++擁有自己的獨立的類庫體系,功能相當強大。 ?。剩幔觯嵴Z言是一種完全的面向對象語言,雖然它的底層(運行時庫)是用C語言開發(fā)的,可是并不依賴于C。因為Java的運行是在運行時庫的支持下進行的,所以運行效率比起可以更接近底層的C/C++來說效率會有所影響,不過Java的類庫采用很好的設計理念設計,非常好用,也非常實用,已經(jīng)成為業(yè)界的一種標準開發(fā)語言。它的跨平臺的特性尤其讓很多開發(fā)者歡迎,你只需要開發(fā)一次就能在所有安裝了Java運行時庫的系統(tǒng)上運行。Java發(fā)展了十幾年了,可以應用領域非常之廣泛,Web開發(fā)有JSP,J2EE,桌面領域現(xiàn)在有JavaFX。 ?。茫J俏④涢_發(fā)的一種編程語言,語法類似Java,幾乎就是從Java的翻版。運行原理和Java也類似,也是通過運行時庫的支持運行。不過支持的平臺還很有限。JAVA幾乎被所有平臺支持,而C#目前只被Windows和Linux支持,Windows下的支持當然是由微軟自己開發(fā)的,而Linux下的支持則有MONO支持。實際上,MONO也是把C#應用轉化為JAVA應用而已,所以本質上,C#仍然只是被微軟自己的操作系統(tǒng)支持。應用平臺受到限制,是它最大的缺點。 ?。茫茫膬?yōu)點在于與底層比較接近,可以控制的粒度更加精細,是開發(fā)系統(tǒng)級應用的最佳選擇。關于缺點,我想正是源于其優(yōu)點,因為它們能控制的編程元素粒度精細,所以編程比較困難,煩瑣,容易出錯。 ?。剩幔觯岷停茫6急容^高級,可以看作高級語言的高級語言,優(yōu)點是開發(fā)容易,但運行效率不如更為底層的C/C++。 具體選擇使用的時候,可以根據(jù)實際的項目需要選擇。運行效率要求高的,底層控制要求高的用C/C++,否則可以選擇Java或C#;跨平臺的要求高的可以用Java。 關于跨平臺,C/C++也是很好的語言,因為所有平臺都支持,不同的是,不同平臺支持的實現(xiàn)不同,類庫不同,要編寫跨平臺的程序,需要選擇跨平臺的類庫,如標準類庫,如果標準類庫的支持不夠也只需要附加編寫一個跨平臺的支持類庫。 幾種語言內容都很多,在這里就不詳細列舉了,要學好每一種都需要花費相當大的精力,祝你能有所成就! C#與JAVA的相同之處:由于C#與JAVA都是基于C++發(fā)展起來的,因此二者之間具有很多相似之處,具體如下:
1、C#和JAVA語言的編譯結果是獨立于計算機和編程語言的,可執(zhí)行文件可以在受管理的執(zhí)行 環(huán)境中執(zhí)行; 2、C#和JAVA語言都是采用了自動的垃圾回收機制; 3、C#和JAVA語言都取消了指針操作; 4、C#和JAVA語言都沒有頭文件; 5、C#和JAVA語言都只支持單重繼承,要實現(xiàn)與多重繼承類似的功能,必須通過接口來實現(xiàn); 6、類都是從Object類派生而來,類的對象通過關鍵字new生成; 7、C#和JAVA語言都支持線程; 8、C#和JAVA語言都沒有全局變量和全局函數(shù),所有的變量和函數(shù)都屬于某個類所有; 9、C#和JAVA語言都支持對數(shù)組和字符串邊界的嚴格檢查,不會出現(xiàn)邊界溢出的情況; 10、C#和JAVA語言都使用“.”操作符,不再使用“->”和“::”操作符; 11、C#和JAVA語言都將null和bool作為關鍵字; 12、C#和JAVA語言中所有的值都必須先初始化后才能使用; 13、C#和JAVA語言中的if語句都不允許采用整數(shù)作為判斷條件; 14、C#和JAVA語言中的try語句塊都可以后接finally語句塊。 C#與JAVA的不同之處: 盡管C#和JAVA有很多相同之處,但是由于二者是兩家不同公司開發(fā)的高級程序設計語言,它們又相互獨立, 自成體系,各自具有一些自己特有的特點,下面將C#與JAVA之間的不同之處如下: 1、屬性 對于那些經(jīng)常使用快速開發(fā)工具,如Delphi或者Visual Basic的開發(fā)人員來說,屬性是一個非常熟悉的概念。 一般來說,通過getXXX可以讀取屬性的值,而通過setXXX可以設置屬性的值。 JAVA中比較常見的屬性操作語句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true); c#中比較常見的屬性操作語句: foo.size++; label.font.bold=true; 很明顯,上述的屬性設置方式較JAVA來說更為簡潔,可主讀性也更強。這充分體現(xiàn)了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來給對象加上索引的功能,從而用與處理數(shù)組類似的方式來處理對象,JAVA語言則不支持index C#中定義index的典型方式如下: public Story this[int index] { get{return stories[index]; } set{ if(value!=null){ stories[index]=value } } 3、delegate :可以認為是一種類型安全、面向對象的函數(shù)指針。 C#使有delegate可以通過一個名字訪問不同的函數(shù),它實現(xiàn)和JAVA中的interface類似的功能,但是它比interface更為好用。 4、event C#提供對event的直接支持,它通過delegate和event關鍵字實現(xiàn)對事件的處理。event關鍵字隱藏所有delegate方法,運算符“+=”和“-+”允許程序員自由加入或者刪除時間處理程序。 5、enum:枚舉用于指定一系列的對象。 C#通過如下語句來定義和使用枚舉: 定義:public enum Direction{North,East,West,South}; 使用:Direction wall=Direction.North; JAVA不直接支持枚舉,如果要實現(xiàn)和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循環(huán),同時還提供了foreach語句(從VB中引入)來循環(huán)處理集合中的元素。 JAVA遍歷集合中的所有元素的典型處理方式如下: while(!collection.isEmpty()) { Object o=collection.get(); connection.next(); … } C#遍歷集合中的所有元素:foreach(object o in collection){…} 7、統(tǒng)一數(shù)據(jù)類型: 大多數(shù)的高級程序設計語言都有基本數(shù)據(jù)類型,如整型、浮點類型等。同時,為了更好地滿足實際的需要,對不同的數(shù)據(jù)類型有不同的處理方式,顯然,如果能夠對簡單數(shù)據(jù)類型的處理和對復雜數(shù)據(jù)類型的處理結合在一起,并用一致的方式加以處理的話,無疑會大大提升應用程序設計的效率,增強程序設計的靈活性。 JAVA語言在處理基本數(shù)據(jù)類型的時候也采取分別處理的策略,但是在基本數(shù)據(jù)類型的基礎上提供了一系列封裝這些基本數(shù)據(jù)類型的類,例如:整型(int)被類Integer所封裝,雙精度浮點(double)被類Double封裝。 C#提供了一種和JAVA不同的方式來實現(xiàn)數(shù)據(jù)類型的統(tǒng)一。事實上,在c#中,即使是int這樣的簡單數(shù)據(jù)類型在C#內部也是通過一個結構體Int32來實現(xiàn)的,在C#中,可以這樣認為,int只是結構體Int32的一個別名。由于C#中的結構體也繼承自類Object,這樣,Object類中定義的方法,各個結構體也擁有,于是,在C#中可以通過如下的方式來操作整數(shù):int I=5; System.Console.WriteLine(i.ToString()); 8、操作符重載 通過操作符重載可以用一種比較自然的方式來操縱各種數(shù)據(jù)類型,從而大大提升程序的可讀性和靈活性。C#中的“==”操作符在Object類中進行了定義,在Object中定義的==操作符通過比較兩個值的引用來獲得最后的結果。如果使有和集合相關的類,則必須在這樣的類中實現(xiàn)ICompar接口,這個接口中定義了一個方法CompareTo,該方法返回兩個對象的比較結果,在此基礎上,可以進一步定義各個實現(xiàn)比較的操作符,如 “>”、“<”、“>=”、“<=”等。事實上,數(shù)字類型(int、long等)可以直接使用這些比較操作符,它們的內部都實現(xiàn)了ICompare接口。 9、多態(tài)性 虛似方法提供了多態(tài)性的技持。多態(tài)意味著派生類可以定義一個和基類中同名的方法。盡管JAVA和C#都支持多態(tài)性,但是它們的具體實現(xiàn)方式還是有一定的差別。 在JAVA語言中,默認情況下,基類的對象可以直接調用派生類中的虛似方法,在C#語言中,基類要調用派生類中的虛似方法必須通過virtual關鍵字來實現(xiàn)。同時,在C#語言中,一個方法要重載基類中的同名方法,還必須通過關鍵字override來實現(xiàn)。在C#中實現(xiàn)多態(tài)的典型程序如下: Class B{ public virtual void foo{}} Class D:B{ public overried void foo(){}} 以上只是簡單地比較了C#和JAVA之間的異同,事實上,這二者之間的比較遠不止上面所介紹的內容,要學好這兩種語言,需要經(jīng)過大量的實踐工作,在實踐中區(qū)分開兩種語言的共同點和不同點。 現(xiàn)在的面向對象的語言大多數(shù)都源自C++,java去掉了C++中那些復雜,實用性低的語言特性,達到了一個不錯的平衡。
C#是在java如日中天的時候產(chǎn)生了,因此它不可避免的引入了java中絕大多數(shù)優(yōu)秀的元素。 因此但從語言特性上,兩種語言不會出現(xiàn)一種能實現(xiàn),而一種無法實現(xiàn)的。 即便大型的應用,也是都可以實現(xiàn),只不過可能在特定的方面,一種要比另一種做的好。 就算是所謂的跨平臺。假如微軟能推出linux版本的CLR和.net framework。c#一樣可以跨,因為它和java都是擁有底層托管機制的。 非要說語言差別,下面基本應該全了,不過這些在另一種中都有替代實現(xiàn)方法。 1.屬性: java中定義和訪問均要用get和set方法,可以不成對出現(xiàn)。 c#中是真正的屬性,定義時get和set必須同時出現(xiàn),房問時用.號即可。不用get,set 2.對象索引 就是對象數(shù)組 public Story this [int index] { 3.C#中,不用任何范圍修飾符時,默認的是protect,因而不能在類外被訪問. 4.因為JAVA規(guī)定,在一個文件中只能有一個public類,而且這個類的名稱必須與文件名一模一樣,這是一個區(qū)別 5.在C#中,它是以Main方法來定位入口的.如果一個程序中沒有一個名為Main的方法,就會出"找不到入口的錯誤".不要把Main寫成main喲 6.C#預定義的簡單數(shù)據(jù)類型比Java多。例如,C#有unit,即無符號整數(shù) 7.忘掉Java中的static final修飾符。在C#中,常量可以用const關鍵詞聲明 C#的設計者還增加了readonly關鍵詞,readonly域只能通過初始化器或類的構造函數(shù)設置 8.公用類的入口點:c#是可以對Main進行重載(java中是main),允許有int返回值和空參數(shù)的Main 9.在Java中,switch語句只能處理整數(shù)。但C#中的switch語句不同,它還能夠處理字符變量。請考慮下面用switch語句處理字符串變量的C#代碼 10.C#沒有>>>移位操作符 11.goto關鍵詞: Java不用goto關鍵詞。在C#中,goto允許你轉到指定的標簽。不過,C#以特別謹慎的態(tài)度對待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。簡而言之,C#有5種類型的可訪問性,如下所示: public:成員可以從任何代碼訪問。 protected:成員只能從派生類訪問。 internal:成員只能從同一程序集的內部訪問。 protected internal:成員只能從同一程序集內的派生類訪問。 private:成員只能在當前類的內部訪問。 17.由于C#中不存在final關鍵詞,如果想要某個類不再被派生,你可以使用sealed關鍵詞 18.與Java不同,C#中的接口不能包含域(Field)。 另外還要注意,在C#中,接口內的所有方法默認都是公用方法。在Java中,方法聲明可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產(chǎn)生一個編譯錯誤。 19.C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來測試某個對象的實例是否屬于特定的類型。在Java中沒有與C#中的as操作符等價的操作符。as操作符與is操作符非常相似,但它更富有“進取心”:如果類型正確的話,as操作符會嘗試把被測試的對象引用轉換成目標類型;否則,它把變量引用設置成null。 20.C#仍舊保留了C++的內存手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的 21.在C#中,所有的異常都從一個名為Exception的類派生 22.枚舉器即enum類型(java無),把它作為一個變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現(xiàn)的值。 23.結構(Struct)與類很相似,而結構是一種值類型,它存儲在棧中或者是嵌入式的,結構可以實現(xiàn)接口,可以象類一樣擁有成員,但結構不支持繼承 24.屬性聲明語法的第一部分與域聲明很相似,第二部分包括一個set過程和/或一個get過程 25.傳值方式: 在java中簡單數(shù)據(jù)類型的值傳參時,都以傳值方式; 在c#中如果加ref則會以引用的方式傳值(方法內部改變該參數(shù),則外部變量一起跟著變); 加out與ref基本相同,但out不要求參數(shù)一定要初始化. 26.c#保留了指針。unsafe 27.代理:代理(delegate)可以看作C++或者其他語言中的函數(shù)指針 代理用來封裝可調用方法。你可以在類里面編寫方法并在該方法上創(chuàng)建代理,此后這個代理就可以被傳遞到第二個方法。這樣,第二個方法就可以調用第一個方法。 代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個步驟:聲明,創(chuàng)建實例,調用。代理用delegate聲明語法聲明。
C#、Java之比較 很多人說C#是微軟用來和Java抗衡的武器,因為二者在很大程度上有著驚人的相似 ,盡管如此,兩者不同的地方也很多,所謂“于細微處見差異”。那么兩者的相似和區(qū) 別都在什么地方呢?我們從今天開始,會從各個角度來對比C#和Java的特點,希望能對 1、C#和.NET平臺的概貌 2、C#和Java
下面簡單地把C#和Java的相似處列出來,雖然在這里我們重點討論的是C#和Java的 不同點,但是了解一下二者的相同之處也是很有必要的。 二者都編譯成跨平臺的、跨語言的代碼,并且代碼只能在一個受控制的環(huán)境中運行 自動回收垃圾內存,并且消除了指針(在C#中可以使用指針,不過必須注明unsafe 關鍵字)都不需要頭文件,所有的代碼都被“包(package)”限制在某個范圍內,并且因為沒有頭文件,所以消除了類定義的循環(huán)依賴所有的類都是從對象派生出來,并且必須使用New關鍵字分配內存用對象加鎖的方式來支持多線程都具有接口(interface)的概念內部類繼承類的時候不會以某種特定的訪問權限來繼承;沒有全局函數(shù)或者常量,一切必須屬于類;數(shù)組或者字符串都自帶長度計算和邊界檢查;只使用“.”操作符,沒有“->”和“::”;"null”、“boolean”和“bool”成為了關鍵字;任何變量均在使用前進行初始化; 不能使用整數(shù)來返回到if條件語句中,必須使用布爾值;“Try”模塊后可以有“finally” ;C#與JAVA之比較(圖表說明)
自從互聯(lián)網(wǎng)出現(xiàn)以來,Java就成了許多開發(fā)者的首選.而許多C++開發(fā)者在較短的時間內轉移到了Java開發(fā)者的隊伍中來. Java成功的開發(fā)和實現(xiàn)了許多高質量的多線程動畫, 游戲, 以及分布的應用程序. 更重要的是,Java 語言是完全平臺無關的.
被稱作Apllets(小應用程序)的Java程序在被下載到本地以前必須首先通過安全認證,這樣就避免了任何病毒鉆入用戶的計算機的企圖. 許多新的改進,諸如旋擺軟件包(swing package), Java2D API, 連網(wǎng)軟件包(java .net)在最初的Java開發(fā)包發(fā)布以后被加進了這種語言里. 從Sun公司發(fā)布Java以來,它的許多競爭對手開發(fā)了這種熱門語言的替代品,一些公司甚至在兩年以前就開始了. 現(xiàn)在一家無需更多介紹的公司--微軟已經(jīng)發(fā)布了一種新的叫做微軟.NET的技術. .NET家族的一種主要的語言是C#或者說C-sharp. 這種語言是從Java/C++繼承而來的. 從我的對C#的六個月的技術上的經(jīng)驗來說,我覺得C#或多或少與Java是相似的.但是C++的許多功能,比方說操作符重載(它在Java中已經(jīng)被移去了)還存在于C#中. Java程序能夠在安裝了Java虛擬機或者JVM的任何平臺上運行.但是.NET程序的平臺要求安裝了通用語言運行庫或者稱做CLR. 它是所有.NET語言運行所需的運行庫.所以一種.NET語言能夠調用另一種.NET語言寫成的模塊和函數(shù). 更進一步的說,如果你學習了種像C#之類的語言,那么你就很容易學習另一種.NET語言因為所有的.NET語言遵循微軟所謂的.NET Framework(架構). 這種架構包括了編寫和安裝健壯的.NET應用程序所必需的類庫.使用.NET你可以通過ASP.NET進行服務器端的編程,這點非常像JAVA中的servlets. 就象Java中的Applets, C#引入了WinForms 和WebForms的概念.使用WinForms你可以設計基于Windows的應用程序而使用WebForms你能夠開發(fā)Web應用程序. 這點可以要么通過C#編程或者是使用Visual Studio.NET這樣的開發(fā)環(huán)境工具來實現(xiàn). 它包含了Visual C#,使用Visual C#你可以非常容易的編寫C#應用程序. 在我們使用Visual C++編程的時候,WinForms幾乎就是win32程序.用C++來開發(fā)這些程序是可能的.但是VC++給我們提供向導來簡化我們的開發(fā)過程.現(xiàn)在Visual C#也在做同樣的工作.因此如果你已經(jīng)是一個VC++的程序員了,那么你最好試一試VC#. Java程序和C#程序的比較 我們應該比較一下用Java寫成的程序和C#的有什么不同. 我們將討論兩個程序間主要的不同點. Hello Java 程序 class Hello { // 類聲明 public static void main(String args[]) { // main 方法,入口點 System.out.println("Hello Java"); // 向控制臺輸出Hello Java } } Hello C# 程序 using System; // 調用System命名空間 class Hello { // 類聲明 public static void Main () { // main 方法, 入口點 console.writeLine("Hello C#"); // 向控制臺輸出 Hello C# } } 在Java中, lang軟件包是自動引入的.在簡單的程序里沒有必要引入這個包.但是在C#中,我們不得不在所有的程序里調用System命名空間. 請記住控制臺是System命名空間下的一個類. 試著運行一下上面的程序并查看它們的輸出結果. Main方法 Java:你有可能編寫一個沒有main方法的Java程序,只要這個類是用來作為父類.但是只有類中包含有正確的Main方法的時候程序才能運行. C#:沒有正確的Main方法就不可能編譯C#源程序.如果main方法缺失了,那么編譯器就會顯示一個錯誤消息:程序'filename.exe'沒有定義入口點. 繼承 Java 和C#都不支持多重繼承而且都提供接口的概念作為多重繼承的替代品.但是C#在接口中包括了更高級的內容.請在本文末找出題為新增加的特點的內容. 操作符和控制流語句 Java中出現(xiàn)的所有諸如算術,邏輯,自增和自減等操作符都可以在C#中找到. 而Java中的像if, else, if-else, for, do-while, while等控制流語句C#統(tǒng)統(tǒng)支持. 但是C# 增加了C++中流行的goto語句. 異常處理 在C#中你可以重用try, catch, finally, throws 語句處理運行時錯誤(通常也叫做異常).C# 中的異常處理過程除了一些小的不同以外幾乎與Java完全相同. C#中System.Exception命名空間是所有異常類的基類. 多線程 C#中多線程的應用比起Java來要容易得多.我們可以使用Monitor 和 Mutex類同步線程. 新增特點 索引,屬性和代理是C#中的新概念.索引幾乎與Java中的向量相同. 對其新特點的完全的討論已經(jīng)超出了我們的范圍.但是我將盡量在這個網(wǎng)站的其它地方解釋它們. C#引入了Java所沒有的操作符重載的概念.但是Java和C#都支持方法重載. 讓我們回到對接口的討論,我們能夠驗證包括在接口中的方法是否是使用is 和 as 操作符實現(xiàn)的.當我們實現(xiàn)接口的時候能避免命名沖突.你甚至可以將兩個接口結合到一個中來,并在類中實現(xiàn)這個復合的接口,如下面的代碼所示: using System; public interface First { void A(); void B(); } public interface Second { void C(); } public interface Combined: First, Second { } class Combineimple: Combined { // 這里是程序代碼 // main方法 } } 而且C#在顯示編譯錯誤的時候還顯示它們的錯誤代碼.你可以搜索與SDK有關的在線文檔尋找和這個錯誤代碼有關的內容并找出這個錯誤發(fā)生的原因的細節(jié). |
|
來自: Frank_Chia > 《.NET》