??引言??
大家好,我是執梗,我致力于寫從Java基礎開始向高階的Java知識,也會涉及到一些演算法知識,有興趣的伙伴可以一起關注交流,歡迎閱讀我的JavaSE基礎系列,今天為大家詳解一下介面,介面的學習非常簡單,卻是我們以后學習作業生活中最常使用的東西,今天這篇文章將帶大家將介面的使用和易錯點一網打盡,
📒博客首頁:執梗的博客
🎉歡迎關注🔎點贊👍收藏??留言📝
?? :熱愛Java學習,期待一起交流!
🙏作者水平很有限,如果發現錯誤,求告知,多謝!
🌺有問題可私信交流!!!
??小劇場??(答案在末尾)
下列關于介面的說法正確的是?(多選)
A.介面中可以定義成員變數,且必須被static final修飾
B.介面中的方法默認訪問權限為public
C.介面和抽象類的區別在于介面的方法必須為抽象方法(jdk1.8后)
D.介面也可以繼承多個介面,
??目錄??
??小劇場??(答案在末尾)
🍅1.什么是介面?
🍄 1.介面基本概念
🍄 2.定義介面的格式
🍄 3.實作介面的格式
🍅2.為什么要有介面?
🍅3.介面的性質和使用
🍈1.介面之間的多實作
🍈2.介面的子類(不是抽象類),必須重寫介面的全部方法
🍈2.介面不可以直接實體化
🍈3.介面中的變數默認都是常量
🍈4.介面中可以定義靜態方法(視jdk版本而定)
🍈5.介面不可以繼承類
??小劇場解答??
🍅1.什么是介面?
🍄 1.介面基本概念
介面(Interface),在JAVA編程語言中是一個抽象型別,是抽象方法的集合,介面通常以interface來宣告,一個類通過繼承介面的方式,從而來繼承介面的抽象方法,
如果一個類只由抽象方法和全域常量組成,那么這種情況下不會將其定義為一個抽象類,只會定義為一個介面,所以介面嚴格的來講屬于一個特殊的類,而這個類里面只有抽象方法和全域常量,就連構造方法也沒有,
🍄 2.定義介面的格式
public interface A {//定義一個介面
public static final String name="hello";//這里即使不寫static final也會被默認加上,全域常量
abstract void test();//抽象方法
}
🍄 3.實作介面的格式
class B implements A{
@Override
public void test() {
System.out.println("重寫了介面A的test方法");
System.out.println(name);//繼承了常量name
}
}
🍅2.為什么要有介面?
我們都知道,Java語言是單繼承多實作的語言,因為只能每個類只能繼承一次,所以繼承是非常寶貴的,如果可以用介面就能實作的,我們盡量不使用繼承來獲得 ,因為每個類都可以實作多個介面,這里不細究到底什么時候使用介面什么時候使用抽象類,抽象類一般是將多個類共有的屬性抽取出來,介面一般是給某個類實作額外特定的功能,比如經理和工人都是為老板服務的,但經理卻在年底有獎金分成,這時我們就可以給可以給經理實作一個包含獲得獎金方法的介面,介面還可以幫助我們完成代碼的解耦,
建議先觀看我的抽象類文章:【JavaSE基礎】深入學習和掌握抽象類,了解易錯知識點
🍅3.介面的性質和使用
🍈1.介面之間的多實作
介面也是可以多實作介面的,比如Java的集合類中的List和Map介面,都是實作了我們的Collection介面,可以實作一個也可以實作多個,因為介面本來就是被運行多實作的,我們通常也可以類似像繼承的概念將它們稱之為父介面和子介面,但是要注意,介面實作介面時用的是extends關鍵字而不是implements
public interface A {//定義一個介面A
}
interface C{//定義一個介面B
}
interface B extends A,C {//介面C繼承A和B介面,
//B介面將繼承A,C介面的屬性和方法
}
🍈2.介面的子類(不是抽象類),必須重寫介面的全部方法
我們知道,介面中的方法一般都是抽象方法(因為在jdk1.8中已經允許介面存在靜態方法),當一個類實作一個介面時,意味者它獲得了這個介面的所有的抽象方法,如果我們不把所有的抽象方法重寫,那么這個類就必須得變為抽象類(因為包含抽象方法的類一定是抽象類),所以一般我們實作介面后,需要將這個介面的所有方法進行重寫,
public interface A {//定義一個介面A
void test1();//抽象方法test1 介面中的方法默認都是抽象方法
void test2();//抽象方法test2
}
class B implements A {//類B實作了A介面
//必須將A介面所有方法重寫,否則B類將變為抽象類
@Override
public void test1() {
System.out.println("重寫test1方法");
}
@Override
public void test2() {
System.out.println("重寫test2方法");
}
}
🍈2.介面不可以直接實體化
介面和抽象類一樣,因為可能包含抽象方法,所以是不可以直接實體化的,但是我們可以利用介面的子類物件向上轉型實體,也就是我們常說的父類物件指向子類實體,
public class A implements B {
public static void main(String[] args) {
B object=new A();
//左為父類介面B 右為子類物件A
}
}
interface B{
}
🍈3.介面中的變數默認都是常量
前面我們說了雖然介面中可以定義變數,但其實這些變數都是默認都被static final修飾,我們知道被static final修飾的變數其實是是我們的全域常量,嚴格意義上它并不叫做變數,我們可以直接通過介面名.變數名的格式訪問,
public class A {//注意這里A并未實作B介面
public static void main(String[] args) {
System.out.println(B.name);//可以訪問name屬性
}
}
interface B{
//其實被默認加了static final
String name="hello";
}
🍈4.介面中可以定義靜態方法(視jdk版本而定)
在老版的jdk中,介面中的方法得為抽象方法,但隨著jdk的更新(以1.8為例),介面中開始允許存在靜態方法,我們可以像類中的靜態方法一樣通過介面名直接呼叫靜態方法,但是這里要注意后續實作介面的類并不能繼承這個方法,因為靜態資源是無法繼續繼承的,JDK1.8中,介面中的方法可以被default和static修飾,但是,被修飾的方法必須有方法體
public class A {//注意這里A并未實作B介面
public static void main(String[] args) {
B.test();//通過介面名直接呼叫
}
}
interface B{
static void test(){
System.out.println("介面中的靜態方法");
}
}
🍈5.介面不可以繼承類
類可以在繼承類的同時實作多個介面,但我們的介面繼承自介面,而不是繼承類,要區分概念
public class A extends C implements B {
//A繼承C的同時實作B介面
}
interface B{
}
class C{
}
??小劇場解答??
答案:ABD
C.在jdk1.8中介面已經允許存在靜態方法了
感覺有用的兄弟們千萬別忘記三連!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/387957.html
標籤:其他
