Java介面的定義與使用
阿新 • • 發佈:2018-11-22
抽象類有單繼承侷限,在java中想要避免單繼承侷限,又想使用抽象方法,用介面。
1.介面的基本概念
介面就是抽象方法和全域性常量的集合(JDK8之前)
定義介面:
interface IMessage{
//全域性常量
public static final String MSG="bonjour"; //IMessage.MSG
//抽象方法
public abstract void print();
}
- 介面優先原則:在一個操作中既可以使用抽象類又可以使用介面的時候,優先考慮介面。
- 介面使用interface關鍵字定義
- 介面命名規範:介面前加 I 來區分介面與類
- 子類可以實現多個介面(使用implements關鍵字),使用介面來實現多繼承
- 子類的例項化物件可以向上轉型為任意介面型別
- 一般使用介面名+Impl來命名子類
程式碼示例:
public class Test7{ public static void main(String[] args){ //介面中的所有抽象方法都被子類覆寫,具有多型性 //使用向上轉型,達到引數統一化、標準化 IMyInterface myInterface = new MyInterfaceImpl(); myInterface.test(); //父介面間的相互轉換 //INews與IMyInterface通過共同子類——MyInterfaceImpl進行相互轉換 INews news = (INews)myInterface; news.getNews(); } } class MyInterfaceImpl implements IMyInterface,INews{ public void test(){ System.out.println(MSG); } public void getNews(){ System.out.println(MSG); } } interface IMyInterface{ public static final String MSG="bonjour"; public abstract void test(); } interface INews{ public abstract void getNews(); }
2.介面使用限制
-
2.1 訪問許可權
- 介面中只有public許可權
介面中定義的變數,實際就是全域性常量,預設public static final
介面中定義的方法預設為public abstract
-
阿里編碼規約:介面中方法和屬性不加任何修飾符,public也不加,保證程式碼簡潔性
-
2.2 子類繼承抽象類和實現介面
- 子類可以先使用extends繼承一個抽象類,後使用implements實現多個介面。
- 先繼承再實現原因:繼承為單繼承,實現為多實現。
-
2.3 抽象類實現介面
- 抽象類可以使用implements實現多個介面,但是介面不能extends繼承抽象類(介面中的方法只有抽象方法,而抽象類中的方法有普通方法、構造方法、抽象方法)
- 抽象類實現介面可以選擇性的覆寫介面中的抽象方法
程式碼示例:
public class Test16{
public static void main(String[] args){
//子類可以實現多個介面,子類的例項化物件可以向上轉型為任意介面型別
QQMessage qq =new QQMessage();
IMessage qq2 = new QQMessage();
IPlatform qq3 = new QQMessage();
qq.print();
//型別之間轉換:編譯階段、執行階段
//為了讓msn實現supportPlateform()方法,將msn強轉為IPlatform型別
//執行時,msn在記憶體空間上建立一個MSNMessage物件
//如果msn instanceof IPlatform為true,則可執行通過;為false,則CCE
//編譯時,msn為IMessage型別,只要強轉為IPlatform,則編譯通過
IPlatform platform = (IPlatform)qq3; //相當於IPlatform platform = new QQMessage();
platform.supportPlateform();
QQMessage qqmessage = (QQMessage)qq2;
qqmessage.printCompany();
}
}
//子類可以實現多個介面
//子類可以繼承抽象類(類),先extends,再implements
//介面的實現類,要實現介面的抽象方法
//雖然抽象類Company已經實現了IMessage介面,但是此處仍可以再寫一遍,強調當前類是IMessage的子類
class QQMessage extends Company implements IMessage,IPlatform{
public void print(){
System.out.println("這是QQMessage");
}
public void supportPlateform(){
System.out.println("QQ支援Windows和Macos平臺");
}
public void printCompany(){
System.out.println("Tencent出品");
}
}
//抽象類實現介面
abstract class Company implements IMessage{
public abstract void printCompany();
}
interface IMessage{
//全域性常量
//介面中定義的變數,實際就是全域性常量
//預設public static final
String MSG="bonjour"; // IMessage.MSG
//抽象方法
//介面中定義的方法預設為public
void print();
}
interface IPlatform{
void supportPlateform();
}
-
2.4 介面繼承介面
- 一個介面可以使用extends繼承多個父介面。
程式碼示例:
public class Test{
public static void main(String[] args){
}
}
class D implements C{
public void test1();
public void test2();
public void test3();
}
interface A{
void test1();
}
interface B{
void test2();
}
interface C extends A,B{
void test3();
}
3.介面的應用
a.定義操作標準(USB2.0標準)
b.表示一種能力,進行一項操作
c.在分散式開發中暴露遠端服務方法
程式碼示例:
public class Test8{
public static void main(String[] args){
Computer computer = new Computer();
computer.use(new Mouse());
computer.use(new Keyboard());
}
}
//定義USB子類
class Mouse implements USB{
public void plugIn(){
System.out.println("將滑鼠接收器插入電腦");
}
public void setup(){
System.out.println("安裝滑鼠驅動");
}
public void work(){
System.out.println("滑鼠使用");
}
}
class Keyboard implements USB{
public void plugIn(){
System.out.println("將鍵盤接收器插入電腦");
}
public void setup(){
System.out.println("安裝鍵盤驅動");
}
public void work(){
System.out.println("鍵盤使用");
}
}
//定義電腦類
class Computer{
public void use(USB usb){
usb.plugIn();
usb.setup();
usb.work();
}
}
//定義USB標準
interface USB{
//插入
void plugIn();
//安裝驅動
void setup();
//工作
void work();
}