抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態(tài)的 main 方法。
一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。
靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象。
含有abstract修飾符的class即為抽象類,abstract類不能創(chuàng)建的實(shí)例對(duì)象。含有 abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。
abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。
接口(interface)可以說(shuō)成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為 public abstract 類型,接口中的成員變量類型默認(rèn)為 public static final。
下面比較一下兩者的語(yǔ)法區(qū)別: 1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。 2.抽象類中可以有普通成員變量,接口中沒有普通成員變量 3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。 4. 抽象類中的抽象方法的訪問(wèn)類型可以是 public,PRotected 和(默認(rèn)類型,雖然 eclipse 下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是 public 類型的,并且默認(rèn)即為 public abstract 類型。 5. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法 6. 抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問(wèn)類型可以任意,但接口中定義的變量只能是 public static final 類型,并且默認(rèn)即為 public static final 類型。 7. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。 下面接著再說(shuō)說(shuō)兩者在應(yīng)用上的區(qū)別:
接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用,例如,模板方法設(shè)計(jì)模式是抽象類的一個(gè)典型應(yīng)用,假設(shè)某個(gè)項(xiàng)目的所有 Servlet 類都要用相同的方式進(jìn)行權(quán)限判斷、記錄訪問(wèn)日志和處理異常,那么就可以定義一個(gè)抽象的基類,讓所有的 Servlet 都繼承這個(gè)抽象類,在抽象基類的 service 方法中完成權(quán)限判斷、記錄訪問(wèn)日志和處理異常的代碼,在各個(gè)子類中只是完成各自的業(yè)務(wù)邏輯代碼。
abstract的method不可以是static的,因?yàn)槌橄蟮姆椒ㄊ且蛔宇悓?shí)現(xiàn)的,而static與子類扯不上關(guān)系。
成員內(nèi)部類可以訪問(wèn)外部類的成員變量(靜態(tài)的也可以)。
靜態(tài)內(nèi)部類可以訪問(wèn)外部類的靜態(tài)變量。靜態(tài)內(nèi)部類不需要?jiǎng)?chuàng)建外部類對(duì)象來(lái)創(chuàng)建靜態(tài)內(nèi)部類對(duì)象。
方法內(nèi)部類只能在方法中使用。
Java中static方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而static方法是編譯時(shí)靜態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
自動(dòng)裝箱是Java編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型之間做的一個(gè)轉(zhuǎn)化。比如:把int轉(zhuǎn)化成Integer,double轉(zhuǎn)化成Double,等等。反之就是自動(dòng)拆箱。
進(jìn)程是執(zhí)行著的應(yīng)用程序,而線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列。一個(gè)進(jìn)程可以有多個(gè)線程。線程又叫做輕量級(jí)進(jìn)程。
監(jiān)視器和鎖在Java虛擬機(jī)中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊,確保一次只有一個(gè)線程執(zhí)行同步代碼塊。每一個(gè)監(jiān)視器都和一個(gè)對(duì)象引用相關(guān)聯(lián)。線程在獲取鎖之前不允許執(zhí)行同步代碼。
指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。
Iterator可用來(lái)遍歷Set和List集合,但是ListIterator只能用來(lái)遍歷List。 Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向。 ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個(gè)和后一個(gè)元素的索引等。
Java中的HashMap使用hashCode()和equals()方法來(lái)確定鍵值對(duì)的索引,當(dāng)根據(jù)鍵獲取值的時(shí)候也會(huì)用到這兩個(gè)方法。如果沒有正確的實(shí)現(xiàn)這兩個(gè)方法,兩個(gè)不同的鍵可能會(huì)有相同的hash值,因此,可能會(huì)被集合認(rèn)為是相等的。而且,這兩個(gè)方法也用來(lái)發(fā)現(xiàn)重復(fù)元素。所以這兩個(gè)方法的實(shí)現(xiàn)對(duì)HashMap的精確性和正確性是至關(guān)重要的。
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似。但是,他們有以下不同點(diǎn): HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。
HashMap提供了可供應(yīng)用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對(duì)鍵的列舉(Enumeration)。
一般認(rèn)為Hashtable是一個(gè)遺留的類。
Array可以包含基本類型和對(duì)象類型,ArrayList只能包含對(duì)象類型。
Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對(duì)于基本類型數(shù)據(jù),集合使用自動(dòng)裝箱來(lái)減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時(shí)候,這種方式相對(duì)比較慢。
ArrayList和LinkedList都實(shí)現(xiàn)了List接口,他們有以下的不同點(diǎn):
ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問(wèn)。與此對(duì)應(yīng),LinkedList是以元素列表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起,在這種情況下,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
相對(duì)于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
LinkedList比ArrayList更占內(nèi)存,因?yàn)長(zhǎng)inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
Comparable是排序接口;若一個(gè)類實(shí)現(xiàn)了Comparable接口,就意味著“該類支持排序”。
而Comparator是比較器;我們?nèi)粜枰刂颇硞€(gè)類的次序,可以建立一個(gè)“該類的比較器”來(lái)進(jìn)行排序。
我們不難發(fā)現(xiàn):Comparable相當(dāng)于“內(nèi)部比較器”,而Comparator相當(dāng)于“外部比較器”。
Enumeration速度是Iterator的2倍,同時(shí)占用更少的內(nèi)存。但是,Iterator遠(yuǎn)遠(yuǎn)比Enumeration安全,因?yàn)槠渌€程不能夠修改正在被iterator遍歷的集合里面的對(duì)象。同時(shí),Iterator允許調(diào)用者刪除底層集合里面的元素,這對(duì)Enumeration來(lái)說(shuō)是不可能的。
HashSet是由一個(gè)hash表來(lái)實(shí)現(xiàn)的,因此,它的元素是無(wú)序的。add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(1)。 另一方面,TreeSet是由一個(gè)樹形的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,它里面的元素是有序的。因此,add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(logn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注