Java與C/C++語言的差別——語言細節問題

1 char類型

java中char是16位的,由於使用的是unicode字符集。java

2 字符串常量

"hello"在java中是一個存在於堆區的匿名內部類對象,由於是對象因此能夠直接用它來調用成員方法,如"hello".equals("hello");這是由於java中採用了「共享設計」的方法,提供一個字符串池保存所有內容。新實例化的對象若是已經在池中定義了,則再也不從新定義,而從池中直接取出繼續使用。String就是採用了這樣的設計,因此內容重複的時候,會將對象指向已經存在的實例空間。編程

3 變量類型

java中的變量類型總共能夠分爲兩大類,一個是基本數據類型,一個是引用數據類型。其中數組和類對象都是屬於引用類型的,這個有什麼不一樣呢?仔細看代碼:數組

JavaClass obj = new JavaClass();多線程

int a[] = new int[100];框架

這相似於C/C++裏面的指針,可是,不是指針。函數

4 sizeof運算符

 java中沒有sizeof運算符this

5 內存管理

java中new了堆內存是不用管的,有GC機制去回收。可是C/C++裏面,new了以後不釋放是找死。spa

6 ==運算符對於String類型的重載

在java中當==運算符計算是兩個String類型對象的時候,計算的是兩個對象的地址是否相等,這點特別要注意,若是要判斷內容是否相等要用成員方法equals()。線程

7 String類對象內容不可改變

String對象內容的改變其實是經過內存地址的「斷開-鏈接」變化完成的,而自己字符串中的內容沒有任何變化。因此,若是對String類對象的內容進行更改效率是極低的,能夠使用StringBuffer類來完成,字符串對象的內容的更改。設計

8 引用做爲參數

java中要注意,當引用做爲參數傳遞的時候,引用自己是值傳遞,可是引用指向的對象是相同的。類的成員函數中能夠用本類的引用做爲參數類型。

9 this表示當前對象

this調用本類中的屬性;this強調本類中的方法;this調用構造方法(注意這時候this()必須是在構造函數的第一行被調用);this表示當前對象。注意this訪問本類中的屬性的時候,若是本類中沒有此成員,那麼繼續從父類中去找。super並無表示父類對象的概念。可是,super能夠直接訪問父類的成員。super調用構造父類構造方法是默認在子類的構造函數中的,並且是先於子類的構造函數調用。若是本身想要指定父類的構造函數,那麼必須放在子類構造函數的第一行代碼。

10 代碼塊

Java中共有4種代碼塊:普通代碼塊,構造代碼塊,靜態(static)代碼塊,同步代碼塊。

其中構造代碼塊是直接寫在類中的代碼塊,每次實例化對象時均執行,且先於構造函數執行。static代碼塊在一個類被加載時執行,且僅僅執行一次。

11 內部類

java中內部類的惟一好處是能夠直接訪問包含內部類定義的外部類中的私有成員。

12 重載與覆蓋

在java中,重載是在一個類中,同名方法不一樣形參列表。覆蓋是在繼承子類中,子類定義了與真正繼承到的東西(除父類的private成員以外)同名的成員,這時就是覆蓋,要訪問父類中的成員要用super關鍵字。

13 final

java中特有final關鍵字。用於類定義,不能被繼承;用於函數,不能被子類覆蓋;用於變量,則成爲常量不能再修改。特別注意,全局常量:public static final String INFO = "gdut_abc";

14 抽象類

java中的抽象類用abstract關鍵字修飾類的定義和其中的成員函數定義。其實,java中的抽象類(只是多了abstract方法)除了不能實例化以外,與普通的類沒有不一樣。

15 多繼承

java沒有多繼承,可是java經過接口來補償。java的接口interface從理解的角度講是一個只能包含:全局常量和抽象函數的類。接口不能夠繼承抽象類,可是能夠繼承extends多個(注意是多個)接口。

16 訪問權限

java中的訪問權限以下圖所示:其中特別注意的是增長了同一包中的類,並且除了是private不能訪問以外,其餘的都能訪問。留意default。記住protected是在public(所有都能訪問)的基礎上少了一個其餘包中的非子類。

17 異常處理

java中的異常處理有try{}catch{}finally{};以及Exception類及其子類;還有e.printStackTrace();還有throw與throws。其中throw是丟出具體的異常類對象;throws是放在函數名的後面,表示這個函數不處理異常,全部在本函數中產生的異常丟給調用處。

18 多線程編程

java直接支持多線程編程,java多線程兩種方式實現,一個是new Thread(實現Runnable接口的類);另外一個是建立一個類直接extends Thread。可是操做線程的主要方法在Thread類中,以下圖所示:

注意:其中的區別是有些類的方法在主線程中調用,有些方法在新創建的線程中調用。區別就在於若是這個動做是子線程本身發起來的,那麼確定是在子線程中調用方法,如獲取當前線程實例Thread.currentThread();線程休眠(特別注意這個是一個類方法)Thread.sleep(ms);線程禮讓執行Thread.currentThread().yield();。而其餘的操做則是由主線程對新線程進行操做的,那麼確定在主線程中執行,如在主線程中設置子線程的優先級t.setPriority(Thread.MIN_PRIOTIRY);對進程的等待t.join();設置線程爲後臺線程t.setDaemon(true);中斷線程t.interrupt();等等。

19 函數定義格式

java中函數的修飾部分比較多,完整的格式以下:

20 泛型

反正泛型的類的類名必定是指定了泛型類型參數的類名。如:Info<String> info = new Info<String>();注意那個<String>已經成爲了類名的一部分。

主要強調下java中受限泛型的運用有兩種方式一種是在聲明泛型類的對象時用,一種是在定義泛型類自己時用,固然也能夠一塊兒用。

1 如在函數的形參列表裏要聲明泛型類對象:void fun(Info< ? extends 具體上限類名> {.......}

2 class Info<T extends  上限類名> {}

若是用super替換extends,那麼表示下限類名。

注意泛型函數的定義不像泛型類的定義那樣在泛型類的後面去定義<T>泛型參數。而是在public等以後就要指出<T>。

21 類集框架/標準模板庫

java中的類集框架是相似於C++裏的標準模板庫相似的東西,可是沒C++的複雜。

Collection接口有四大子接口:List,Set,Queue,SortedSet接口。其中的List接口有ArrayList和Vector以及LinkedList子類(鏈表的操做類)。Set接口(元素不可重複的子類)有HashSet(元素不可重複不排序散列存放)和TreeSet子類(元素不可重複排序存放)。TreeSet靠實現了Comparable接口的compareTo()來完成排序;Set接口靠Object的hashCode()判斷是否對象可能重複,若是有兩個對象的hashCode相同,那麼進一步調用equals()方法繼續判斷。

Iterator是標準的用於訪問類集的接口。可是注意,它在每一次類集對象.iterator()以後實際上是靜態的,若是這時候類集對象本身remove()了其中的元素,那麼這個Iterator就會無效。除非用iterator()方法再獲取一次。

相關文章
相關標籤/搜索