區(qū)別:Java不可以將一個(gè)非布爾值當(dāng)做布爾值在邏輯表達(dá)式中使用,C++卻可以。C++引入了操作符重載機(jī)制,Java不支持。C++有g(shù)oto,Java沒(méi)有g(shù)oto。C++中有多繼承,Java中只有單一繼承,但Java可以通過(guò)接口實(shí)現(xiàn)多繼承。
本教程操作環(huán)境:windows7系統(tǒng)、C++17&&java8版本、Dell G3電腦。
C++和Java的區(qū)別:
盡管Java是基于C++的的,但是相比之下,Java是一種更純粹的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。在Java中,一切都被視為對(duì)象。
1、C++創(chuàng)建對(duì)象之后,需要再使用完將其調(diào)用delete方法將其銷毀;Java有垃圾回收機(jī)制,用來(lái)監(jiān)視new出來(lái)的所有對(duì)象,辨別不會(huì)再被引用的對(duì)象,然后釋放內(nèi)存空間。
2、作用域(C、C++、Java的作用域由花括號(hào)的位置決定):
但是以下代碼在C和C++中是合法的,在Java中編譯器會(huì)報(bào)告變量已定義。因?yàn)镃和C++會(huì)將較大作用域的變量隱藏起來(lái),但是Java不允許。
{ int x = 12; { int x = 96; } }
3、基本成員的默認(rèn)值
當(dāng)變量作為類的成員使用時(shí),Java才給定默認(rèn)值,以確保那些基本類型的成員變量得到初始化,但是C++沒(méi)有此功能。而對(duì)于局部變量,C++編譯器會(huì)對(duì)其予以警告,Java則會(huì)視為錯(cuò)誤。
4、Java不可以將一個(gè)非布爾值當(dāng)做布爾值在邏輯表達(dá)式中使用,C++卻可以。
在C++中表達(dá)式的值為0則為假,非0則為真。
例如:
if(1){ }
5、移位操作符
Java中新增了一種“無(wú)符號(hào)”右移位操作符(>>>),它使用“零擴(kuò)展”,無(wú)論正負(fù),都在高位插入0。這是C、C++中所沒(méi)有的。
6、C++引入了操作符重載機(jī)制,Java不支持,但是C#中可以實(shí)現(xiàn)自己的重載操作符。
7、Java允許我們把任何基本數(shù)據(jù)類型轉(zhuǎn)換成別的基本數(shù)據(jù)類型,除了布爾類型外?!鞠嚓P(guān)視頻教程推薦:Java視頻教程】
8、Java沒(méi)有Sizeof()。在CC++中,sizeof()操作符可以告訴我們?yōu)閿?shù)據(jù)項(xiàng)分配的字節(jié)數(shù),因?yàn)镃++中不同的數(shù)據(jù)類型在不同的機(jī)器上可能有不同的大小。但是Java中所有數(shù)據(jù)類型在所有機(jī)器中大小都是相同的。(例如,C++的int在16位機(jī)器上為16位,在32及以上為32位,long在32位及以下為32位,在64位上為64位)
9、C++有g(shù)oto,Java沒(méi)有g(shù)oto。
Java提供了一種類似的跳轉(zhuǎn)機(jī)制:標(biāo)簽。用法 label:
label1: outer-iteration{ inner-iteration{ break;(1) continue;(2) continue label1;(3) break label1;(4) } }
-
(1)中,break中斷內(nèi)部迭代,回到外部迭代
-
(2)中,continue使執(zhí)行點(diǎn)移回到內(nèi)部迭代的起始處。
-
(3)中,continue label1同時(shí)終端內(nèi)部迭代以及外部迭代,直接轉(zhuǎn)到label1處;隨后繼續(xù)迭代,從外部迭代開(kāi)始。
-
(4)break label1 也會(huì)中斷所有迭代,并回到label1處,但是不重新進(jìn)入迭代。即完全終止兩個(gè)迭代。
10、C++中析構(gòu)函數(shù)是提供一個(gè)在對(duì)象刪除前可以釋放這個(gè)對(duì)象所占用的資源的機(jī)會(huì),但是Java并未提供“析構(gòu)函數(shù)”或者類似的概念。 【相關(guān)視頻教程推薦:C++視頻教程】
在C++中,對(duì)象一定會(huì)被銷毀(程序沒(méi)有缺陷的情況下);
在Java里,對(duì)象卻并非總是被垃圾回收。(垃圾回收并不等于“析構(gòu)”)
11、名稱屏蔽
如果Java的基類擁有某個(gè)已被多次重載的方法名稱,那么在導(dǎo)出類中重新定義該方法名稱并不會(huì)屏蔽其在基類中的任何版本。而C++若要在子類中引入一個(gè)新的重載方法,則需要屏蔽基類方法。
12、C++中有多繼承,Java中只有單一繼承。Java可以通過(guò)接口實(shí)現(xiàn)多繼承。
13、Java是半解釋和半編譯的,運(yùn)行速度比C++慢。
14、Java沒(méi)有Struct或者Union
15、Java的泛型不允許使用基本數(shù)據(jù)類型。
16、數(shù)組
-
在c++中,數(shù)組定義時(shí),已經(jīng)分配存儲(chǔ)空間,并可以使用。 (定義時(shí)指定數(shù)組大小)
-
在java中,數(shù)組定義時(shí),int arr[],只字義了數(shù)組變量,數(shù)組是不可以使用的。 只有數(shù)組new以后,才會(huì)創(chuàng)建數(shù)組,分配存儲(chǔ)空間,并可以使用。 (定義時(shí)指定數(shù)組大小是非法的,創(chuàng)建時(shí)指定數(shù)組大小)
17、C++有指針,Java沒(méi)有。
18、附上C++在32位和64位系統(tǒng)的主要長(zhǎng)度對(duì)比: