1)抽象類與接口的問題鹉动,面了好幾個公司廊宪,都會被問到,其實(shí)這也是開發(fā)過程中經(jīng)常遇到的問題姥闭,在這里所說的接口是指jdk1.8之前的,因?yàn)閖dk1.8中接口是可以有默認(rèn)方法等改動的越走。
2)如果為了面試棚品,直接跳過所有的靠欢,看我整理的那張表格就行了。
1铜跑、抽象類:
(1)抽象類的含義
??包含抽象方法的類叫做抽象類门怪。如果一個類包含一個或多個抽象方法,該類必須被限定為抽象的(否則锅纺,編譯器會報錯)
(2)抽象類的點(diǎn)
1.含有abstract修飾符的class即為抽象類掷空,abstract類不能創(chuàng)建實(shí)例對象。
2.含有abstract方法的類必須定義為abstract class囤锉,abstract class類中的方法不必是抽象的坦弟。
3.abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以官地,不能有抽象構(gòu)造方法或抽象靜態(tài)方法酿傍。
4.如果子類沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型区丑。
2拧粪、接口(interface):
(1)接口的含義
??可以說成是抽象類的一種特例修陡,接口中的所有方法都必須是抽象的沧侥。能有的內(nèi)容是:static final的靜態(tài)成員變量、public abstract的抽象方法(可以使用abstract關(guān)鍵字也可以不使用)
(2)接口的點(diǎn)
1.接口中的域隱式地是static和final的魄鸦;
2.接口可以嵌套在類或其他接口中宴杀;
3.接口是實(shí)現(xiàn)多重繼承的途徑;
4.接口中的方法定義默認(rèn)為public abstract類型拾因,接口中的成員變量類型默認(rèn)為public static final旺罢。
5.接口不能有構(gòu)造器;
6.接口中不能有main()方法绢记;
3扁达、語法的區(qū)別:
1.普通成員變量:抽象類中可以有普通成員變量,接口中沒有普通成員變量(static final變量)蠢熄;
2.方法:抽象類中可以包含非抽象的普通方法跪解,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法签孔;
3.靜態(tài)成員變量:抽象類和接口中都可以包含靜態(tài)成員變量叉讥,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型饥追,并且默認(rèn)即為public static final類型图仓。
4.靜態(tài)方法:抽象類中可以包含靜態(tài)方法,但不能是抽象靜態(tài)方法但绕;接口中不能包含靜態(tài)方法(靜態(tài)的方法不能被覆寫)
5.構(gòu)造方法(靜態(tài)的):抽象類可以有構(gòu)造方法救崔,接口中不能有構(gòu)造方法;
6.方法訪問權(quán)限:抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然eclipse下不報錯六孵,但應(yīng)該也不行)碳竟,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型狸臣。
7.子類實(shí)現(xiàn)和繼承: 一個類可以實(shí)現(xiàn)多個接口莹桅,但只能繼承一個抽象類。
8.初始化過程:當(dāng)一個類在初始化時烛亦,要求其父類全部都已經(jīng)初始化過了诈泼;但是一個接口在初始化時,并不要求其父接口全部都完成初始化煤禽,只有在真正使用父接口的時候(如引用接口中定義的常量)铐达,才會初始化。
4檬果、應(yīng)用上的區(qū)別:
??接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用瓮孙,主要用于定義模塊之間的通信契約;而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用选脊,可以實(shí)現(xiàn)代碼的重用杭抠。
??例如,模板方法設(shè)計(jì)模式是抽象類的一個典型應(yīng)用恳啥,假設(shè)某個項(xiàng)目的所有Servlet類都要用相同的方式進(jìn)行權(quán)限判斷偏灿、記錄訪問日志和處理異常,那么就可以定義一個抽象的基類钝的,讓所有的Servlet都繼承這個抽象基類翁垂,在抽象基類的service方法中完成權(quán)限判斷、記錄訪問日志和處理異常的代碼硝桩,在各個子類中只是完成各自的業(yè)務(wù)邏輯代碼沿猜。
5、表格形式區(qū)別總結(jié):
總結(jié)區(qū)別
6碗脊、使用接口的原因:
1)為了能夠向上轉(zhuǎn)型為多個基類型(由此而帶來的靈活性)啼肩;
2)與使用抽象基類相同:防止客戶端程序員創(chuàng)建該類的對象,并確保這僅僅是建立一個接口望薄。
7疟游、問題:使用接口還是抽象類?
答:如果要創(chuàng)建不帶任何方法定義和成員變量的基類痕支,就應(yīng)該選擇接口而不是抽象類颁虐。抽象類為了代碼的復(fù)用,接口為了多態(tài)性卧须。