接口的意义:
从宏观来看是一种规则,从微观来看是一个功能
例如:1.猫会吃东西,狗会吃东西,羊会吃东西...
吃东西便是一个功能可以作为接口
2.电脑的USB接口在设计时是否考虑上面插入的是鼠标还是键盘
只要符合USB的规则就可以
接口的定义
使用格式:
访问权限修饰符 interface 接口名{
}
接口中可以有什么:
1,可以有公共静态常量
接口中的属性默认使用public static final修饰并不能修改
2,接口中可以定义公共静态方法
3,接口中可以定义公共抽象方法
接口中没有方法体的方法默认使用public abstract修饰
4,jdk1.8以后可以在接口中定义使用default修饰的普通方法
不能有什么:
1,不能有普通属性
2,不能有构造函数
3,不能定义普通方法
/*
* 定义一个接口
*/
public interface MyInterface {
//接口中的属性默认使用public static final修饰
//接口中只有公共静态常量
public static final String NAME = "xxx";
String TAG = "tag";
//接口中不能有构造函数
//接口中不能定义普通方法 ,可以定义公共静态方法(public修饰)
public static void test01() {}
//接口中可以定义公共抽象方法
public abstract void test02();
//接口中没有方法体的方法默认使用public abstract修饰
void test03();
//jdk1.8以后可以使用default修饰普通的方法
default void test04() {
System.out.println("xxx");
}
}
接口的使用
接口与接口
关系:多继承关系
一个接口可以有多个父接口,格式为
访问权限修饰符 interface 子接口名 extends 父接口1,父接口2...{
}
可以继承:
1,子接口继承了父接口的公共静态常量属性
2,子接口可以继承父接口的公共抽象方法
不能继承:
1,子接口无法继承父接口的公共静态方法
接口与类
关系:多实现关系
一个类可以实现多个接口,格式为
访问权限修饰符 class 子类名 implements 父接口1,父接口2...{
}
注意:
1,一个类实现多个接口,要么重写所有接口中的抽象方法,要么自己也是抽象类
2,子类继承了父接口的公共静态常量属性,但是不能继承父接口的公共静态方法
3,一个子类对象可以转换为多个实现的接口对象
练习:鸟会飞,飞机会飞,请使用接口实现
类:
鸟类
实现飞的接口
飞机类
实现飞的接口
接口:
飞的接口
//飞的接口
public interface FlyInterface {
void fly();
}
//飞机类实现飞的接口
public class Plane implements FlyInterface{
public void fly() {
System.out.println("飞机会飞");
}
}
//鸟类实现飞的接口
public class Bird implements FlyInterface {
public void fly() {
System.out.println("鸟会飞");
}
}
public class Demo03 {
public static void main(String[] args) {
Bird bird = new Bird();
Plane plane = new Plane();
bird.fly();
plane.fly();
}
}
常量接口:
概念:一个接口中只有定义的公共静态常量
如:
public interface LoginInterface{
String OK = "登录成功";
String ERROR_01 = "账号密码不匹配";
String ERROR_02 = "账号不符合规则";
String ERROR_03 = "密码不符合规则";
String ERROR_04 = "账号不存在";
String ERROR_05 = "验证码错误";
...
}
优点:
便于使用,方便修改
函数式接口
概念:一个接口中只有一个抽象方法,不管属性
如:
public interface MethodInterface{
返回值类型 method(形参列表);
}
这种接口可以在后期配合Lambda表达式使用,使代码更加简洁,便于书写
例:
/**
* 请使用接口实现,杯子可以装水,烧水器可以装水
*
*/
public interface GetWater {
void getWater();
}
public class Cup implements GetWater{
public void getWater() {
System.out.println("使用杯子装水");
}
}
public class SH implements GetWater{
public void getWater() {
System.out.println("使用烧水壶装水");
}
}
public class Water {
private String name;
public Water() {
super();
}
public Water(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void water(GetWater getWater) {
System.out.println(name);
getWater.getWater();
}
}
/*
* 请使用接口实现,杯子可以装水,烧水器可以装水
*/
public class Demo05 {
public static void main(String[] args) {
Water water01 = new Water("矿泉水");
Water water02 = new Water("自来水");
Cup cup = new Cup();
water01.water(cup);
SH sh = new SH();
water02.water(sh);
}
}
接口的回调
概念:接口对象传出去,接口对象回来调用接口中的方法
例如上面装水的问题,其中一段代码
public void water(GetWater getWater) {
System.out.println(name);
getWater.getWater();//这里调用的方法就使用了接口的回调
}
接口的回调在后面匿名内部类中有更明显的应用,匿名内部类稍后也会更新
有什么问题欢迎留言讨论