接口和抽象類的區別是什么?
參考答案
Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:
接口中所有的方法 隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個接口,但是只能繼承一個抽象類
類可以不實現抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
接口中所有的方法 隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個接口,但是只能繼承一個抽象類
類可以不實現抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在 不提供接口方法實現的情況下實現接口。 ?
Java接口中聲明的變量 默認都是final的。( 為什么)抽象類可以包含非final的變量。
Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化, 但是,如果它包含main方法的話是可以被調用的。
也可以參考JDK8中抽象類和接口的區別
問題1.Java接口中聲明的變量
默認都是final的。(
為什么)
interface中的變量是當作常量來設計的,它不但是final,而且還是public static的,也即interface中的變量一定是public static final的,換言之,這個變量實際上已經是個“常量”。
解答:java接口中成員變量必須是final類型的原因如下:
1. 接口中的數據對所有實現類只有一份,所以是static
2.要使實現類為了向上轉型成功,所以必須是final的.這個舉例子很好理解.比如接口A,A有變量value.實現類A1,A2,可以向上轉型.假如代碼中有一句:
A a=null;
a=....(2)實際實現類
System.out.println(a.value);
利用向上轉型,可以得到接口a的值,在第2步中,我不關你是實現類A1,還是new A2(),通過轉型,我們可以得到正確的值.要是類中可以更改,我們得不到一個統一的值,接口也沒有了意義.
假設接口的成員變量x不是final的,且默認有值。
如果你在某接口的實現類A中把x改為其他值,(能夠改掉接口中的 嗎,假如是繼承的父類呢),那么另一個實現類B中對x有依賴的方法全部都出錯了,這樣接口還怎么能起到“模板”的作用呢
接口中如果可能定義非final的變量的話,而方法又都是abstract的,這就自相矛盾了,有可變成員變量但對應的方法卻無法操作這些變量,雖然可以直接修改這些靜態成員變量的值,但所有實現類對應的值都被修改了,這跟抽象類有何區別? (不懂,抽象類是怎么樣的,抽象類可以包含非final的變量。)又接口是一種更高層面的抽象,是一種規范、功能定義的聲明,所有可變的東西都應該歸屬到實現類中,這樣接口才能起到標准化、規范化的作用。所以接口中的屬性必然是final的。