為什么會有人覺得java相對于c?
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++中沒有
結束語進化不進化,一目了然了吧