java ——介面的定義和使用
為了實現像c++中的多繼承性,Java中引入了介面的概念,介面和單重繼承相結合很好的實現了多重繼承的功能。介面和類非常相似,介面用於定義幾個類具有的但又不再這些類中定義的功能,通過在介面中設定這些方法,描述出共同的特性,然後由類本身定義如何實現。
介面優先原則: 在一個操作既可以使用抽象類又可以使用介面的時候,優先考慮使用介面。
介面定義: 介面就是由一個抽象方法與全域性常量組成的特殊類(JDK8之前)介面使用interface引導,分為介面宣告和介面體。在介面體中只進行方法的宣告,不能進行方法的實現。
有關介面的定義要注意以下幾點:
1.Interface是宣告介面的關鍵字,可以把它看成一個特殊的類。
2.宣告介面可給出訪問控制符,用public修飾的是公共介面,可以被所有的類和介面使用。若介面宣告為public,那麼介面中的方法和變數也全部為public。如果是預設修飾符的介面,則只能被同一個包中的其他類和介面使用。(一句話:介面可以用訪問控制符宣告)
3.介面名要求符合Java識別符號的規定。(一句話: 介面前加 “ I(大寫i) ” 來區分介面與類)
4.介面也具有繼承性,定義一個介面時,可以通過extends關鍵字宣告該介面是某個已經存在的父介面或派生介面,它將繼承父介面所有的屬性和方法,一個介面還可以繼承多個父介面,父介面間用逗號隔開。(一句話:介面具有繼承性,用extends連線)
5.系統預設介面中所有屬性的修飾符都是public static final。
6.系統預設介面中所有方法的修飾符都是public abstract。
7.在介面中對抽象方法宣告時,只能給出這些抽象方法的方法名、返回值和引數列表,而不能定義方法體,即這些介面僅僅只是規定了一組資訊的交換、傳輸和處理的“介面”。通常把對介面功能的”繼承“稱為”實現“。 (一句話:只有方法宣告,沒有方法實現)
介面的命名規範: 介面前加 “ I(大寫i) ” 來區分介面與類
子類實現介面使用implements關鍵字,並且子類可以同時實現多個父介面(可以使用介面來實現多繼承)一般使用 介面名+Impl 來命名子類
interface IMyInterface{ public static final String MSG = "test"; public abstract void test(); } interface INews{ public abstract void getNews(); } class MyInterfaceImpl implements IMyInterface,INews{ //子類實現兩個介面 public void test(){ System.out.println(MSG); } public void getNews(){ System.out.println(MSG); } } public class Test{ public static void main(String[] args){ IMyInterface myInterface = new MyInterfaceImpl(); myInterface.test(); INews news = new MyInterfaceImpl(); news.getNews(); } } //--------------------------- public class Test{ public static void main(String[] args){ IMyInterface myInterface = new MyInterfaceImpl(); //父介面的相互轉換 INews news = (INews)myInterface; //因為它們有相同的子類,所以之間可以相互轉換 news.getNews(); } }
1.介面的使用限制
一個類實現一個介面,必須給出介面中所有方法的實現。如果不能實現某方法。也必須寫出一個空方法。
Java中允許多個類實現同一個介面,這些類之間可以是無聯絡的,每個類各有自己實現方法的細節,這是與繼承機制的不同之處。
介面中只有public許可權(不管是屬性還是方法,其許可權均為public,類中預設是的default)
介面中public 、static 、 final 、 abstract 均可以省略。
阿里編碼規約:介面中方法和屬性不要加任何修飾符,public也不要加,保證程式碼簡潔性。
//完整格式
interface IMessage{
public static final String MSG = "i am a biter";
public abstract void print();
}
//簡化格式
interface IMessage{
String MSG = "i am a biter";
void print();
}
1.1.2
當一個子類既需要實現介面又需要繼承抽象類時:
第一步:請先使用extends繼承一個抽象類;
第二步:使用implements實現多個介面。
1.1.3
抽象類可以使用implements實現介面,但是介面不能繼承(extends)抽象類。
interface IMyInterface{ //介面
String MSG = "test";
void test();
}
abstract class News implements IMyInterface{ //抽象類實現介面
public abstract void getNews();
}
class MyInterfaceImpl extends News{ //子類繼承抽象類
public void test(){
System.out.println(MSG);
}
public void getNews(){
System.out.println(MSG);
}
}
1.1.4
介面不可以繼承抽象類,介面可以繼承介面。
interface A{
void test1();
}
interface B{
void test1();
}
interface C extends A,B{
void test3();
}
class D extends C{
//D要覆寫三個介面
}
介面應用
-
定義操作標準(USB2.0標準)
-
表示一種能力,進行一項操作
-
在分散式開發中暴露遠端服務方法