[JavaSE]难以理解的接口真叫人头大

接口

接口(interface)用来描述类应该做什么,而不需要描述应该具体如何做。

一个类可以实现(implement)一个或多个接口。

编译之后也是一个.class字节码文件

概念

接口不是类,而是对希望符合这个接口的类的一组需求

特点

接口中的所有方法都自动是public方法。(但在实现接口时,必须把方法声明为public)

接口中只可以定义常量和抽象方法,但绝对不可能有实例字段。
在这里插入图片描述

接口与抽象类

学习接口的时候会有一个疑问:

为什么要那么麻烦引入接口的概念呢,直接定义抽象类不就行了吗?

然而每个类只能扩展一个类,但每个类可以实现多个接口。例如如果将Comparable定义为抽象类,Employee类已经继承了Person类,那么它想再继承Comparable抽象类就不行了。

public abstract class Comparable{
    public abstract int compareTo(Object other);
}

class Person{
    ...
}

class Employee extends Comparable,Person {		//错误
    public int compareTo(Object other){...}
}

利用接口可以实现“多继承”。

另外,一个接口可以继承多个接口。

静态和私有方法

在Java8之后,可以在接口中定义静态方法。

在Java9中,接口中的方法可以是private,private方法可以是静态方法也可以是实例方法。由于私有方法只能在接口本身的方法中使用,所以它们的用法很有限,只能作为接口中其他方法的辅助方法。

接口在开发中的作用

注意:

接口在开发中的作用类似于多态在开发中的作用。

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。

总结:

接口+多态降低程序的耦合度,提高程序的扩展力。

面向接口编程遵循了OCP(Open Close Principle)开放-关闭原则:对扩展开放对修改关闭

接口的重要作用:解耦合

降低的是调用者和实现者之间的耦合度,一个项目中最难的部分时定义接口,而实现者的类和调用者的类可以分开并同时进行编写,也就是常说的面向接口编程。

例如:

//菜单接口
public interface FoodMenu{			

	void xiHongShi();

	void fanQie();
}
//顾客类(接口的调用方)
public class Customer{			
	private FoodMenu foodMenu;		

	public Customer(){
	}
	public Customer(FoodMenu foodMenu){
		this.foodMenu = foodMenu;
	}

	public void setFoodMenu(FoodMenu foodMenu){
		this.foodMenu = foodMenu;
	}

	public FoodMenu getFoodMenu(){
		return foodMenu;
	}

	public void order(){
		foodMenu.xiHongShi();
		foodMenu.fanQie();
	}
}
//厨师类(接口的实现方)
public class Chef implements FoodMenu{
	public void xiHongShi(){
		System.out.println("西红柿");
	}

	public void fanQie(){
		System.out.println("番茄");
	}
}
public class Test{
	public static void main(String[] args){
		//创建厨师对象
		FoodMenu chef = new Chef();

		//创建顾客对象
		Customer customer = new Customer(chef);

		//顾客点菜
		customer.order();
	}
}

输出结果:
在这里插入图片描述
这个例子中,顾客只跟菜单打交道,不管后厨是谁,而厨师只管实现菜单上的菜。

如果将来厨师换了,只需要将测试类的对象改为新的厨师并利用多态创建新的对象即可。

FoodMenu chef = new NewChef();

顾客类的代码不需要更改任何一处。

哪怕把厨师类和测试类删了程序也能编译通过,把顾客类和测试类删了程序也能编译通过,这就充分的说明了调用者和实现者是毫不相干的,通过面向接口的编程达到了降低耦合度,提高程序扩展性的作用。

通过学习,自己也只是粗略总结了一下对接口理解,相信未来可以通过在项目中能够逐渐理解面向接口编程的妙处所在,冲冲冲~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值