先上結論:介面沒有,抽象類可以有,
甚至于有其他的區別:
- 介面不能有方法體,抽象類可以有(僅限java8以前)
- 介面不能有靜態方法,抽象類可以有(僅限java8以前)
- 介面中的變數必須由public static final修飾,抽象類不要求
首先針對構造方法而言很好理解:
抽象類雖然內部的方法可以不用具體描述方法體,但是歸根結底,抽象類其實是一個標準的類,它里面的內容完全可以按照一個標準的類進行描述,并且與一般類一樣使用extends進行繼承,在創建抽象類時,IDE會默認生成無參構造,你也可以自己定義,這些都是可以的;
介面則不一樣,根據博主lllllzllll所言對介面的描述:
介面只是定義功能和行為規范,如果一個類實作了一個介面,那么這個類必須遵守這個介面的方法約定,但沒有is-a的關系,
介面作為一種宣告,不需要進行初始化,所以根本不需要構造器對其進行構造,
其次針對方法體和靜態方法:
這是看見上面所說的博主文章下面評論區說的,java8之后:
java8讓介面與抽象類之間距離更近一步,java8以后,介面中可以有默認方法,靜態方法,不再是純抽象的東西了
所以這個要看仔細,但其中有些注意點:
-
靜態方法
從java8開始介面里可以有靜態方式,用static修飾,但是介面里的靜態方法的修飾符只能是public,且默認是public,
譬如:
interface Test{
static void test1(){//不寫public也可,默認為public
System.out.println("靜態方法");
}
}
class TestClass{
public static void main(String[] args){
Test.test1();//與呼叫普通類的靜態方法一致
}
}
-
非靜態方法
java8里,除了可以在介面里寫靜態方法,還可以寫非靜態方法,但是必須用default修飾,且只能是public,默認也是public,這方法稱為默認方法,
interface Test{
default void test1(){//不寫public也可,默認為public
System.out.println("默認方法");
}//該方法需要實體化后呼叫,可使用匿名內部類進行實體化
}
最后,介面內的屬性為啥都是public static final
查看了大佬徐明曉的文章:為什么介面中的成員變數非得是public static final的呢?
各自提到這三個修飾符的意義:
public: 使介面的實作類可以使用這個常量
static:表示它屬于類的,隨的類的加載而存在的,如果是非static的話,就表示屬于物件的,只有建立物件時才有它,而介面是不能建立物件的,所以介面的常量必須定義為static,
final:是保證介面定義的常量不能被實作類去修改,如果沒有final的話,由子類隨意去修改的話,介面建立這個常量就沒有意義了,
參考文章:
[1] 《Java中抽象類和介面中有構造方法嗎?》 https://blog.csdn.net/qq_40728375/article/details/79890223 作者:lllllzllll
[2] 《java8新特性之函式式介面、lambda運算式、介面的默認方法、方法和建構式的參考》 https://blog.csdn.net/zymx14/article/details/70175746 作者:Howard_14
[3] 《為什么介面中的成員變數非得是public static final的呢?》 https://blog.csdn.net/weixin_43518038/article/details/107807340 作者:徐明曉
歡迎大佬們提出自己的想法!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412854.html
標籤:Java
上一篇:Go - 如何撰寫 ProtoBuf 插件 (三) ?
下一篇:java學習筆記day1
