本文主要為C#開發(fā)人員了解Java提供一些基礎(chǔ)。
Java中缺少C#的功能
C#包含更多原始類型和捕獲算術(shù)異常的功能。
包括大量的Java注釋便利,其中許多,例如運算符重載和用戶定義的強制轉(zhuǎn)換,已經(jīng)為C ++程序員社區(qū)所熟悉。
事件處理是“一流的公民”,它是語言本身的一部分。
允許定義“結(jié)構(gòu)”,這些結(jié)構(gòu)類似于類,但可以在堆棧上分配(與C#和Java中類的實例不同)。
C#將屬性作為語言語法的一部分來實現(xiàn)。
C#允許switch語句對進行操作string。
C#允許提供閉包功能的匿名方法。
C#允許迭代器通過功能樣式y(tǒng)ield關(guān)鍵字使用協(xié)程。
C#支持輸出參數(shù),幫助返回多個值,這是C ++和SQL共享的功能。
C#具有別名空間的能力。
C#具有“顯式成員實現(xiàn)”,該類允許類從其自己的類方法中單獨實現(xiàn)接口的方法。這也允許它實現(xiàn)兩個不同的接口,碰巧具有相同名稱的方法。接口的方法不必是public; 它們只能通過該界面進行訪問。
C#提供了與COM的集成。
按照C和C ++的示例,C#允許按引用調(diào)用原始類型和引用類型。
C#中缺少Java的功能
Java的strictfp關(guān)鍵字保證浮點運算的結(jié)果在各個平臺之間保持相同。
Java支持檢查異常,以更好地實施錯誤捕獲和處理。
語言之間的哲學差異
Java中沒有無符號的原始數(shù)字類型。盡管普遍認為在代碼中混合有符號和無符號變量是不好的,但是Java缺乏對無符號數(shù)字類型的支持,這使其在某種程度上不適合低級編程。
C#不包括檢查的異常。有人會認為檢查異常對于良好的編程習慣非常有幫助。其他人,包括首席C#語言架構(gòu)師Anders Hejlsberg,認為它們在某種程度上是Java的實驗,而且還沒有證明它們是值得的。
C#的命名空間與C ++中的命名空間更為相似。與Java不同,名稱空間不指定源文件的位置。(實際上,對于Java源文件位置來說,對應(yīng)它的包目錄結(jié)構(gòu)并不是絕對必要的。)
C#包括委托,而Java不包括。有人認為委托使方法調(diào)用模型復雜化,因為委托是通過反射來處理的,這通常很慢。另一方面,它們可以通過消除聲明新的(可能是匿名的)類以掛接到事件的需要,從而簡化代碼。
Java要求源文件名必須與其中的唯一public類匹配,而C#允許public同一文件中有多個類。
C#允許使用指針,某些語言設(shè)計者認為這是不安全的,但是某些語言功能試圖確保不會意外濫用此功能。指針還極大地使諸如Java的RMI(遠程方法調(diào)用)之類的技術(shù)復雜化,在該技術(shù)中,可以在一臺完全獨立的計算機上運行的程序中引用駐留在一臺計算機上的程序?qū)ο?。一些人推測,Java中缺少內(nèi)存指針(被對象引用的更抽象的概念所取代)是網(wǎng)格計算時代的頭號功臣,網(wǎng)格應(yīng)用程序可以將單個應(yīng)用程序分布在許多物理硬件上。
C#支持goto關(guān)鍵字。有時這可能很有用,但是通常建議使用結(jié)構(gòu)化的控制流方法。
C#具有真正的多維數(shù)組,相對Java可用的數(shù)組(C#稱為鋸齒狀數(shù)組)。多維數(shù)組始終是矩形的(在2D情況下,或?qū)τ诟蟮木S數(shù)類似),而數(shù)組可以存儲各種長度的行(同樣在2D情況下)。如果內(nèi)存是一個瓶頸(只有一個內(nèi)存引用而不是兩個內(nèi)存引用,則矩形陣列可能會加快訪問速度);如果內(nèi)存不完整但成本高昂,則鋸齒狀數(shù)組可以節(jié)省內(nèi)存(每行一個指針的代價) 。矩形數(shù)組還消除了為每行顯式分配內(nèi)存的需要。
Java不包括運算符重載,因為濫用運算符重載可能導致難以理解和調(diào)試的代碼。C#允許操作符重載,如果謹慎使用,則可以使代碼更簡潔,更易讀。Java缺乏重載使其在某種程度上不適合某些數(shù)學程序。相反,.NET的數(shù)字類型不與add / subtract / etc共享公共接口或超類方法,限制了數(shù)值庫的靈活性。
默認情況下,C#中的方法是非虛擬的。但是,在Java中,默認情況下方法是虛擬的。虛方法保證將調(diào)用對象的最終重載方法,該方法由運行時確定。在調(diào)用或編寫任何虛擬方法時,您始終必須牢記這一點!如果該方法聲明為非虛擬方法,則調(diào)用的方法將由編譯器確定。這是Java和.NET平臺的設(shè)計者之間的主要哲學差異。
Java 1.5的泛型使用類型擦除。當Java源代碼編譯為字節(jié)碼時,有關(guān)泛型類型的信息將會丟失。.NET 2.0的泛型在編譯后得以保留,因為從.NET公共語言運行時2.0版(簡稱CLR)開始,對泛型的支持。Java的方法允許Java 1.5二進制文件在1.4 JRE中運行,但要付出額外的運行時類型檢查的代價。
C#是由ECMA和ISO標準定義的,而Java是專有的,盡管在很大程度上是通過開放社區(qū)流程進行控制的。
C#API完全由Microsoft控制,而Java API通過開放的社區(qū)流程進行管理。
.NET運行時允許托管和非托管代碼,從而實現(xiàn)Java的純托管代碼環(huán)境中不存在的某些類型的錯誤,但也可以與現(xiàn)有代碼進行交互。
問題:java在默認中,所有方法都是虛方法,這意味著什么?
答:這意味著,java中的所有對象,基本上都有了動態(tài)代理的潛在可能
-
JAVA
+關(guān)注
關(guān)注
19文章
2952瀏覽量
104479 -
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135856 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453
發(fā)布評論請先 登錄
相關(guān)推薦
評論