1. 程式人生 > >Java介面的定義與使用

Java介面的定義與使用

抽象類有單繼承侷限,在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();
}