-
1 # killman
-
2 # 一樽還酹江月10
一個更加純粹的面嚮物件語言,可以算得上是一次進化,那些程式設計中的複雜易錯的部分問題,都由語言本身附帶的技術給你解決,而使用者幾乎不必關係,如此簡單與方便,難道稱不上是一次進化麼!
-
3 # SwiftHub
JAVA語言與C++相比優劣勢分析 對於JAVA語言以及C++的定義我們在這裡不再敘述,接下來我們直接分析 JAVA和C++相比其中的優劣勢:
優勢:
1.Java比C,C++簡單,學起來比C\C++容易
2.Java完全物件化,比如陣列在Java中是一個物件,含有length這個屬性; 而不像C++中陣列是一個指標。所以訪問陣列,Java都會進行邊界檢查,更安全 ,但犧牲了速度。同時因為Java中所有類都會繼承Object這個基類,所以可以 把幾個好不相干的類用基類聯絡起來,比如放在同一個數組裡。
3.Java中沒有指標這樣不安全(雖然指標速度快)的概念。
4.Java中有完善的記憶體管理機制,能自動垃圾回收,最大可能降低記憶體溢 出的可能,同時提高程式設計效率。
5.Java中有完善的異常機制(標準C++中不夠完善)。
6.java中保持資料時物件本身是在堆裡,同時靠一在棧裡的控制代碼與之連線 。這個設計更合理。 由以上幾點可見Java更安全。
7.Java標準庫完整的多,相比之下C++除了一個STL(而且還超級難用)就沒 了,實際C++程式設計中需要大量使用第3方庫。這很大程度上是因為Java有一些商 業公司支援,更新速度快,而C++只有一個可憐的標準委員會,上一個C++標準 版本還是C++98
8. Java因為是把程式編譯為位元組碼,執行時需要JVM把位元組碼再翻譯為機 器碼,所以他跨平臺,一次編譯到處執行。但這也是他慢的根本原因。
9.Java原生支援多執行緒(C++僅靠標準庫辦不到),原生的UI,如AWT Swing
劣勢:
1.Java比C\C++慢。Java 1.0 比C慢20倍 現在的Java 1.6執行速度也只是C 的一半。
2. C++在繼承和派生上比Java更靈活
3. C++ 中可以直接插入彙編 能直接操控底層硬體 所以作業系統還是得用 c寫
4. Java辦的到C++一定辦得到,C++辦得到的Java則不一定。
5. Sun被甲骨文收購了之後,Java的發展很受影響。
6. C++編譯的程式可以直接執行,Java需要安裝JRE有幾十MB,影響產品發 布的使用者體驗。
二者的異同:Java與C/C++的異同
java為解釋性語言,執行過程為:程式原始碼經過java編譯器編譯成位元組碼,然後由JVM執行;而c/c++
為編譯性語言,原始碼經過編譯和連結後生成可執行的二進位制程式碼。因此,java的執行速度比c/c++慢,但java能夠跨平臺,c/c++不能
java為純面嚮物件語言,程式碼包括函式,變數等,必須在類中實現,除了基本資料型別(包括int,float等)外,所有型別都是類,此外,java中不存在全域性變數或全域性函式,而c++相容面向物件和麵向過程程式設計的特點,可以定義全域性變數和全域性函式
java中沒有指標,有效防止c++中操作指標可能引起的系統問題,程式更安全
java不支援多重繼承,但可以透過實現多個介面來實現與c++中多重繼承類似的目的,因為介面也是具有多型性質的
c++中需要開發人員去管理記憶體的分配,包括申請與釋放,通常把要釋放的資源放到解構函式中。java中提供垃圾回收機制實現垃圾自動回收,無需關心何時釋放無用物件記憶體。當垃圾回收器將要釋放無用物件的記憶體時,會首先呼叫該物件的finalize()方法。
c++支援運算子過載,java不支援
c++支援預處理(標頭檔案,宏定義等),java沒有預處理功能,但是提供的import機制和c++中預處理功能相似
c++支援預設函式引數,java不支援
c/c++支援goto語句,java不提供(但java中goto是保留關鍵字)
java不支援自動強制型別轉換,必須由開發人員進行顯式的強制型別轉換
java具有平臺無關性,每種資料型別都分配固定長度,例如int型別總是佔據32位,而c/c++中同一資料型別在不同平臺會分配不同的位元組數
java提供對註釋文件的內建支援,所以原始碼檔案也可以包含他們自己的文件,透過一個單獨的程式,可以將這些文件資訊提取出來,並重新格式化成html
java包含了一些標準庫。例如提供用於訪問資料庫的jdbc庫,用於實現分散式物件RMI等標準庫,而c++則依靠一些非標準的,有其他廠商提供的庫
面試中也許會有人問你這些問題:
1.記憶體分配
java中對記憶體的分配是動態的,JVM自動對記憶體進行掃描,對長期不用的空間作為”垃圾”進行收集,使得系統資源得到更充分地利用.按照這種機制,程式設計師不必關注記憶體管理問題,這使Java程式的編寫變得簡單明瞭,並且避免了了由於記憶體管理方面的差錯而導致系統出問題.而C語言透過malloc()和free()這兩個庫函式來分別實現分配內在和釋放記憶體空間的,C++語言中則透過運算子new和delete來分配和釋放記憶體.
2.資料型別的長度
Java對每種資料型別都分配固定長度.Java對每種資料型別都分配固定長度.比如,在Java中,int型別總是32位的,而在C和C++中,對於不同的平臺,同一個資料型別分配不同的位元組數,同樣是int型別,在PC機中為二位元組即16位,而在VAX-11中,則為32位.這使得C語言造成不可移植性,而Java則具有跨平臺性(平臺無關性).
3.指標
程式設計者無法找到指標來直接訪問記憶體,並且增添了自動的記憶體管理功能,從而有效地防止了c/c++語言中指標操作失誤,如野指標所造成的系統崩潰。但也不是說JAVA沒有指標,虛擬機器內部還是使用了指標,只是外人不得使用而已。這有利於Java程式的安全。
4.繼承
c++支援多重繼承,這是c++的一個特徵,它允許多父類派生一個類。儘管多重繼承功能很強,但使用複雜,而且會引起許多麻煩,編譯程式實現它也很不容易。Java不支援多重繼承,但允許一個類繼承多個介面(extends+implement),實現了c++多重繼承的功能,又避免了c++中的多重繼承實現方式帶來的諸多不便。
5.資料型別及類 Java是完全面向物件的語言,所有函式和變數都必須是類的一部分。除了基本資料型別之外,其餘的都作為類物件,包括陣列。物件將資料和方法結合起來,把它們封裝在類中,這樣每個物件都可實現自己的特點和行為。而c++允許將函式和變數定義為全域性的。
6.運算子過載 Java不支援運算子過載。運算子過載被認為是c++的突出特徵,在Java中雖然類大體上可以實現這樣的功能,但運算子過載的方便性仍然丟失了不少。Java語言不支援運算子過載是為了保持Java語言儘可能簡單。
7.預處理功能 Java不支援預處理功能。c/c++在編譯過程中都有一個預編澤階段,即眾所周知的預處理器。預處理器為開發人員提供了方便,但增加了編譯的複雜性。JAVA虛擬機器沒有預處理器,但它提供的引入語句(import)與c++預處理器的功能類似。
8.goto語句 “可怕”的goto語句是c和c++的“遺物”,它是該語言技術上的合法部分,引用goto語句引起了程式結構的混亂,不易理解,goto語句子要用於無 條件轉移子程式和多結構分支技術。鑑於以廣理由,Java不提供goto語句,它雖然指定goto作為關鍵字,但不支援它的使用,使程式簡潔易讀。
9.異常
java中有異常機制用於捕獲異常,為c++中沒有
結束語進化不進化,一目瞭然了吧 -
4 # 語法糖June
當你瞭解計算機組成原理之後及相關多種語言開發(高階語言和低階語言比如彙編)經驗之後,你就會更明白:
c++相對於java來說,還算偏底層,最簡單的實驗就是我們必須給程式分配地址,而java的記憶體都是自動管理,一般情況不需要程式猿手動分配,它有專門的機制,比如垃圾回收GC等等,它擯棄了c或者c++中的指標,把萬物皆看著物件處理;當你使用多語言開發經驗之後,會對兩種語言使用場景和用法等比較。
回覆列表
進化只是相對來說的。每個語言都有自己擅長的領域。java適合web。c+適合遊戲和桌面程式。py適合ai。c適合底層。c#有點類似java。沒有誰進化誰。只是有些語言拋棄了一些難懂的東西。使學習成本降低同時也犧牲掉了效能