今天下午看書看到一道關(guān)于抽象類和接口的題目高职,雖然之前看《Java編程思想》的時候感覺自己都弄明白了,但是時隔幾個月感覺有些陌生了辞州。不要緊怔锌,趁這個機會復習復習吧。
幾個問題
接口是否可以繼承接口变过?
可以埃元。
抽象類是否可以實現(xiàn)接口?抽象類是否可以繼承具體類媚狰?抽象類是否能擁有static聲明的靜態(tài)方法亚情?
都可以。抽象類歸根結(jié)底還是一個類啊哈雏,對于抽象類楞件,我們只需記住它和普通類的唯一區(qū)別:不能創(chuàng)建抽象類的實例對象、允許有abstract聲明的方法裳瘪。為什么不能創(chuàng)建實例對象呢土浸?因為其中的抽象方法是沒有方法體的,不知道它究竟有多少私有變量彭羹,要占多大的空間黄伊,所以無法為它分配內(nèi)存。對于后兩個問題派殷,直接點还最,show you the code:
抽象類可以有構(gòu)造函數(shù)嗎?
顯然可以毡惜。從上面的圖中就可以看出拓轻。而且從上面的圖中我們還可以看出抽象方法還可以定義自己的私有成員變量。
抽象方法可以聲明為private和static嗎经伙?
不能扶叉。IDE會提示private(static)和abstract不能放在一起。這個很容易理解帕膜,聲明為private的之后子類無法繼承到它枣氧,自然無法“實現(xiàn)”這個方法了;而static表示可通過類名來調(diào)用的函數(shù)垮刹,而抽象方法是沒有方法體的达吞,調(diào)用它還什么都不能做。所以它們在語法上是被禁止的荒典。
接口可以有構(gòu)造函數(shù)嗎酪劫?
不可以吞鸭。因為它都不是一個“類”,當然不能創(chuàng)建實例對象契耿,所以當然不能有構(gòu)造函數(shù)。值得注意的是螃征,接口可以有成員變量搪桂,而且只能是public static的,你用其他關(guān)鍵字來約束會報錯“Modifier 'protected'(或者'private') not allowed here”盯滚,而且可以不用顯式的指定這兩個關(guān)鍵字踢械,編譯器默認認定它就是“public static”。
接口可以有靜態(tài)方法嗎魄藕?
可以内列。這是在jdk1.8中新引入的特性。這有點違反了抽象的意義背率。
抽象類可以無抽象方法嗎话瞧?
問題提得越來越怪異了!但是這個問題的回答是“可以”寝姿。最明顯的例子就是空類交排,即只有類的聲明,里面什么東西都沒有饵筑。有時為了不讓某個類被實例化埃篓,故意把沒有抽象方法的類用abstract聲明為抽象類。
沒有抽象方法的抽象類可以被實例化嗎根资?
答案是:不能架专。不行的話咱試一下就知道了。原因我想應(yīng)該是“一票否決制”玄帕,就是說編譯器只要“看”到你new的類的前面有abstract關(guān)鍵字修飾時部脚,就認定有語法錯誤,而不去檢查你到底有沒有抽象方法裤纹,當然這只是我猜想的睛低,不知道對不對(有知道的同學請求留言告知,謝謝_)服傍。
子類必須實現(xiàn)抽象父類的所有抽象方法嗎钱雷?
視情況而定,如果子類也是抽象類吹零,則不必實現(xiàn)父類的所有抽象方法罩抗,否則,必須實現(xiàn)父類的所有抽象方法灿椅。
抽象類和接口里可以有內(nèi)部類嗎套蒂?
都可以钞支。這個參考了CSDN博客:Java牛角尖【002】:類可以被static修飾嗎?,雖然原文主要不是想闡述我這個問題操刀,但是博主的舉的例子還是可以參考的烁挟,我直接把代碼搬運過來吧。
抽象類中:
public abstract class StaticClassDemo {
public static void main(String[] args) {
StaticClassDemo.InnerClass ic = new StaticClassDemo.InnerClass();
ic.showMessage("Hello, world");
}
public abstract void showMessage(String msg);
static class InnerClass extends StaticClassDemo{
public void showMessage(String msg){
System.out.println(msg);
}
}
}
接口中:
public interface StaticClassDemo {
public void showMessage(String msg);
static class InnerClass implements StaticClassDemo{
public void showMessage(String msg){
System.out.println(msg);
}
public static void main(String args[]){
StaticClassDemo.InnerClass ic = new StaticClassDemo.InnerClass();
ic.showMessage("Hello, world");
}
}
}
總結(jié)
總的說來骨坑,內(nèi)部類還算是一個“類”撼嗓,所以它擁有與“類”相似的性質(zhì),而接口不是“類”欢唾,自然是沒有構(gòu)造函數(shù)的且警,但是可以有自己的成員變量,供實現(xiàn)它的各類使用礁遣。
自認為還是菜鳥斑芜,如有說錯的地方,請多指教祟霍。更多文章杏头,歡迎移步我的博客