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();
}

猜你喜欢

转载自blog.csdn.net/qq_42142477/article/details/84238917