1、所有東西都必須置入一個類。不存在全局函數或者全局數據。如果想獲得與全局函數等價的功能,可考慮將static方法和static數據置入一個類里。注意沒有象結構、枚舉或者聯合這一類的東西,一切只有“類”(Class)!
2、 在Java中,類定義采取幾乎和C++一樣的形式。但沒有標志結束的分號。沒有class foo這種形式的類聲明,只有類定義。
3、Java中沒有作用域范圍運算符“::”。Java利用點號做所有的事情,但可以不用考慮它,因為只能在一個類里定義元素。即使那些方法定義,也必須在一個類的內部,所以根本沒有必要指定作用域的范圍。我們注意到的一項差異是對static方法的調用:使用ClassName.methodName()。除此以外,package(包)的名字是用點號建立的,並能用import關鍵字實現C++的“#include”的一部分功能。
4、 靜態引用的字串會自動轉換成String對象。和C及C++不同,沒有獨立的靜態字符數組字串可供使用。
5、java數組名是對象,數組保存的僅僅是對象的引用,而不是對象本身,而c++數組名是數據結構。JAVA里數組的內存分配是在堆里面的,必須用new來分配,而C++里面是在棧里面分配的,定義的時候會自動分配。
6、Java中不必進行提前聲明。若想在定義前使用一個類或方法,只需直接使用它即可——編譯器會保證使用恰當的定義。所以和在C++中不同,我們不會碰到任何涉及提前引用的問題。
7、 被定義成類成員的對象句柄會自動初始化成null。對基本類數據成員的初始化在Java里得到了可靠的保障。若不明確地進行初始化,它們就會得到一個默認值(零或等價的值)。可對它們進行明確的初始化(顯式初始化):要么在類內定義它們,要么在構建器中定義。采用的語法比C++的語法更容易理解,而且對於static和非static成員來說都是固定不變的。我們不必從外部定義static成員的存儲方式,這和C++是不同的
8、在Java里,沒有象C和C++那樣的指針。用new創建一個對象的時候,會獲得一個引用(本書一直將其稱作“句柄”)。例如:
String s = new String("howdy");
然而,C++引用在創建時必須進行初始化,而且不可重定義到一個不同的位置。但Java引用並不一定局限於創建時的位置。它們可根據情況任意定義,這便消除了對指針的部分需求。在C和C++里大量采用指針的另一個原因是為了能指向任意一個內存位置(這同時會使它們變得不安全,也是Java不提供這一支持的原因)。
9、Java中沒有“破壞器”(Destructor)。變量不存在“作用域”的問題。一個對象的“存在時間”是由對象的存在時間決定的,並非由垃圾收集器決定。有個finalize()方法是每一個類的成員,它在某種程度上類似於C++的“破壞器”。但finalize()是由垃圾收集器調用的,而且只負責釋放“資源”(如打開的文件、套接字、端口、URL等等)。由於Java不支持破壞器的概念,所以在必要的時候,必須謹慎地創建一個清除方法
10、 Java中沒有goto。它采取的無條件跳轉機制是“break 標簽”或者“continue 標准”,用於跳出當前的多重嵌套循環。
11、Java采用了一種單根式的分級結構,因此所有對象都是從根類Object統一繼承的。而在C++中,我們可在任何地方啟動一個新的繼承樹,所以最后往往看到包含了大量樹的“一片森林”。在Java中,我們無論如何都只有一個分級結構。盡管這表面上看似乎造成了限制,但由於我們知道每個對象肯定至少有一個Object接口,所以往往能獲得更強大的能力。C++目前似乎是唯一沒有強制單根結構的唯一一種OO語言。
12、“垃圾收集”意味着在Java中出現內存漏洞的情況會少得多,但也並非完全不可能(若調用一個用於分配存儲空間的固有方法,垃圾收集器就不能對其進行跟蹤監視)。
13、Java內建了對多線程的支持。利用一個特殊的Thread類,我們可通過繼承創建一個新線程(放棄了run()方法)。若將synchronized(同步)關鍵字作為方法的一個類型限制符使用,相互排斥現象會在對象這一級發生。在任何給定的時間,只有一個線程能使用一個對象的synchronized方法。在另一方面,一個synchronized方法進入以后,它首先會“鎖定”對象,防止其他任何synchronized方法再使用那個對象。只有退出了這個方法,才會將對象“解鎖”。在線程之間,我們仍然要負責實現更復雜的同步機制,方法是創建自己的“監視器”類。遞歸的synchronized方法可以正常運作。若線程的優先等級相同,則時間的“分片”不能得到保證。
14、Java中的繼承具有與C++相同的效果,但采用的語法不同。Java用extends關鍵字標志從一個基礎類的繼承,並用super關鍵字指出准備在基礎類中調用的方法,它與我們當前所在的方法具有相同的名字(然而,Java中的super關鍵字只允許我們訪問父類的方法——亦即分級結構的上一級)。通過在C++中設定基礎類的作用域,我們可訪問位於分級結構較深處的方法。亦可用super關鍵字調用基礎類構建器。正如早先指出的那樣,所有類最終都會從Object里自動繼承。和C++不同,不存在明確的構建器初始化列表。但編譯器會強迫我們在構建器主體的開頭進行全部的基礎類初始化,而且不允許我們在主體的后面部分進行這一工作。
15、 Java中沒有virtual關鍵字,因為所有非static方法都肯定會用到動態綁定。在Java中,程序員不必自行決定是否使用
16、Java語言不需要程序對內存進行分配和回收。Java丟棄了C++ 中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,並提供了自動的廢料收 集,Examda提示: 在Java語言中,內存的分配和回收都是自動進行的,程序員無須考慮內存碎片的問題。
17、Java用接口(Interface)技術取代C++程序中的多繼承性。接口與多繼承有同樣的功能,但是省卻了多繼承在實現和維護上的復雜性。
18、多重繼承 c++支持多重繼承,這是c++的一個特征,它允許多父類派生一個類。盡管多重繼承功能很強,但使用復雜,而且會引起許多麻煩,編譯程序實現它也很不容易。Java不支持多重繼承,但允許一個類繼承多個接口(extends+implement),實現了c++多重繼承的功能,又避免了c++中的多重繼承實現方式帶來的諸多不便。
19、預處理功能 Java不支持預處理功能。c/c++在編譯過程中都有一個預編澤階段,即眾所周知的預處理器。預處理器為開發人員提供了方便,但增加了編譯的復雜性。JAVA虛擬機沒有預處理器,但它提供的引入語句(import)與c++預處理器的功能類似。
20、Java不支持缺省函數參數,而c++支持
21、字符串 c和c++不支持字符串變量,在c和c++程序中使用Null終止符代表字符串的結束,在Java中字符串是用類對象(strinR和stringBuffer)來實現的,這些類對象是Java語言的核心
22、
異常 JAVA中的異常機制用於捕獲例外事件,增強系統容錯能力
1
2
3
4
5
6
7
|
try{//可能產生例外的代碼
}catch(exceptionType name){
//處理
}
|
其中exceptionType表示異常類型。而C++則沒有如此方便的機制。