之前把抽象类和接口放在一起讲了,觉得还是太草率了,现在重新讲一下这个接口吧。
接口也是一种引用类型,可以等同看做类
-
如何定义接口,语法:
[修饰符] interface 接口名{ } -
接口中只能出现:常量、抽象方法
-
接口其实是一个特殊的抽象类,特殊在接口是完全抽象的
-
接口中没有构造方法,接口也无法被实例化
-
接口和接口之间可以多继承
-
一个类可以实现多个接口(这里的实现可等同看作继承)
-
一个非抽象的类实现接口,需要将接口中所有的方法实现/重写/覆盖
public interface A{
//常量(必须用public static final修饰)
public static final String SUCCESS="success";
public static final double PI=3.14;
//public static final是可以省略的
byte MAX_VALUE=127;//常量
//抽象方法(接口中所有的抽象方法都是public abstract
public abstract void m1();
//public abstract是可以省略的
void m2();
}
interface B{
void m1();
}
interface C{
void m2();
}
interface D{
void m3();
}
interface E extends B,C,D{ // 接口和接口之间可以多继承
void m4();
}
//implements是实现的意思,是一个关键字
//implements和extends意义相同
class MyClass implements B,C{ // 一个类可以实现多个接口
public void m1() { // 一个非抽象的类实现接口,
// 需要将接口中所有的方法实现/重写/覆盖
}
public void m2() {
}
}
//一个非抽象的类实现接口,需要将接口中所有的方法实现/重写/覆盖
class F implements E{
public void m1() {}
public void m2() {}
public void m3() {}
public void m4() {}
}
我就是个憨憨,这段代码可以运行吗?
不可以
没有主方法运行个锤子,我就不一样了
我看视频以为人家可以运行,谁知道他是编译成功,8是运行!!!于是我傻乎乎地去问别人。
煜而好学,不耻上问,憨憨是也。
下面这段代码实例才是可以运行的:
/*
客户业务接口
接口作用:
1.可以使项目分层,所有层都面向接口开发,开发效率提高
2.接口使代码与代码之间的耦合度降低,就像内存条和主板,可随意更换
3.抽象和接口都能完成某个功能,优先选择接口
因为接口可以多实现,多继承,并且一个类除了实现接口之外,还可以继承其他类(保留了类的继承)
*/
interface CustomerService {
//定义一个退出系统的方法
//抽象方法,实际上省去了public abstract
void logout();
}
/*
编写接口的实现类
该类的编写完全是面向接口去实现的
*/
class CustomerServiceImpl implements CustomerService{
public void logout() {
System.out.println("成功退出系统");
}
}
public class Test01 {
//入口
public static void main(String[] args) {
//要执行CustomerServiceImpl中的logout方法
//以下程序面向接口去调用
CustomerService cs=new CustomerServiceImpl();// 多态
//调用
cs.logout();
}
}
运行结果为:
成功退出系统。
接口作用:
1.可以使项目分层,所有层都面向接口开发,开发效率提高
2.接口使代码与代码之间的耦合度降低,就像内存条和主板,可随意更换
其实好比你中午出去吃饭,你是顾客,顾客与厨师之间有没有接口?
有的,就是菜单啊
顾客不会跑到厨房跟厨师说我要吃什么东西,厨师也不会跑到大厅看你来的是谁
总之咱们餐馆有一菜单,也就是接口,这个接口的实现者是谁?就是厨师,他把这个菜单进行实现,而顾客就是面向接口(菜单)去点菜,顾客与厨师不需要商量。
比如你现在要了一份小鸡炖蘑菇,几秒钟就给你端上来了,为什么啊?因为厨师早就把这道菜做好啦,而你只能根据接口点菜,那就给你上呗。
接口就是提前约定好的一套协议,一个标准,大家都去面向接口,目的在于降低顾客和厨师的关联程度,效率大大提高。