本文详细的介绍了接口的相关知识,包括但不限于以下知识:
- 接口的概念、语法、接口的使用、常用方式
- 接口与抽象类的区别(语法规则、定性区别)
- 接口回调(深入理解接口回调思想,附有案例代码)
1.接口
(1)概念
宏观
规则
微观
功能
概述:
接口可以看作java对一种对行为的抽象。
(2)语法定义
语法:
访问权限修饰符 interface 接口名{
}
(3)接口中有什么
**1、2条非常重要**
1,公共静态常量
接口中的属性默认使用public static final修饰
2,接口中可以拥有公共抽象方法
接口中的抽象方法默认使用 public abstract修饰
3,公共静态方法,无法被继承
4,接口中可以拥有default 修饰的普通方法(了解)
5,接口没有构造函数
6,接口中没有代码块
(4)接口的使用:继承与实现
接口与接口:多继承
关键字:extends
语法:
访问权限修饰符 interface 接口名 extends 父接口名1,父接口名2,...{
}
注意:
1,不继承父接口的静态方法
2,可以继承父接口的公共静态常量
3,可以继承父接口的所有抽象方法
接口与类:多实现
关键字:implements
语法:
访问权限修饰符 class 类名 extends 父类名 implements 父接口名1,父接口名2,...{
}
注意:
1,一个类可以实现多个接口
2,要么这个类重写所有接口的抽象方法,要么自己也是抽象类
(5)常用方式
1,常量接口
接口中全部定义的是常量
原因:接口中的属性默认使用public static final修饰
eg:需要记录几个永远不会发生改变的值
public class Utils{
public static final int ERROR_01 = 500;
public static final int ERROR_02 = 404;
public static final int ERROR_03 = 305;
public static final int OK = 200;
}
2,空接口
接口中没有任何东西
原因:代表一种规则,使其子类对象可以转换为该接口对象
3,接口回调
见下文!
2.接口与抽象类的区别
(1)语法规则区别
相同的
1,不能直接创建对象
2,都可以编译为class文件
不同的
1,接口中没有普通属性,抽象类有
2,接口中没有代码块与静态代码块,抽象类有
3,接口中没有构造函数,抽象类有
4,接口中没有普通方法,抽象类有
5,接口只能被类实现,抽象类只能被继承,一个类只能继承一个类,但是可以实现多个接口
6,接口的本质是规则或者功能,抽象类的本质是一个概念
(2)java中定性区别
1,抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2,设计层面不同,抽象类作为很多子类的父类,它是一种 模板式设计。
而接口是一种行为规范,它是一种 辐射式设计。
3,抽象类是一个类,而接口不是类。
3.接口回调
(1)接口变量
- 接口和类一样,是Java中的一种数据类型,用接口声明的变量称之为接口变量
- 接口变量中存储的是 实现了 该接口的类的实例的引用
(2)接口回调概念
接口回调借用了C语言中指针回调的术语
指针回调,表示一个变量的地址在某一时刻存放在一个 指针变量 中,这个 指针变量 可以间接操作该变量中存放的数据;
接口回调,指的是可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口方法。
- (其实当 接口变量 在调用被类实现的接口方法时,就是在通知相应的对象调用这个方法)
- 但是接口变量无法调用类中其他的非接口方法;(类似于上转型对象调用子类重写的方法)
(3)接口回调与多态
把实现接口的类的实例的引用 赋值给接口变量 后,该接口变量就可以 回调 类重写的接口方法。
不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量就在回调接口方法时可能具有多种形态。
(4)接口参数
如果一个方法的参数为接口类型的数据,那么可以将任何实现该接口的类的实例的引用传递给该参数,接口参数也可以回调类实现的方法
(5)接口回调一般步骤
步骤:
- 在A中创建接口对象
- 在A创建B对象
- 使用B对象调用方法,将接口对象传递到B中
- 在A中使用B对象调用方法,该方法中使用接口对象调用接口方法
接口回调实现案例:按钮点击
分析:
用户点击不同的按钮会触发不同的事件
例如:
打游戏时点击键盘w、a、s、d会触发不同事件,释放不同技能,因此w、a、s、d都具有释放技能这一行为(功能)
进而可以将此功能封装到接口中,对于按钮来说其必须实现这一功能
(点击释放技能,不同的按钮具有不同效果,可以使用接口回调实现不同按钮的预设点击效果)
------1. 接口(抽象某一行为特征)------
public interface OnClickLisenter {
public void onClick();
}
------2. 接口实现类(按钮点击事件:点击按钮就会触发此事件(行为))(不同按钮实现方法体不相同)------
public class EventBtn01 implements OnClickLisenter {
@Override
public void onClick() {
// TODO Auto-generated method stub
System.out.println("你好,世界!");
}
}
public class EventBtn02 implements OnClickLisenter{
@Override
public void onClick() {
// TODO Auto-generated method stub
System.out.println("你好,JAVA");
}
}
------3. 按钮类(以接口变量接收实现类,可以屏蔽事件的差异,实现点击的不同效果)------
public class Button {
//以接口变量的形式接受传过来的事件,即:屏蔽事件的差异性
private OnClickLisenter onClickLisenter;
//监听点击事件(形参以接口变量的形式接收)
public void setOnClickLisenter(OnClickLisenter onClickLisenter) {
this.onClickLisenter = onClickLisenter;
}
//点击按钮触发事件
public void down() {
onClickLisenter.onClick();
}
}
------4. 测试环境------
/*
* 点击按钮(按钮1弹出你好世界,按钮2弹出好程序员)
*
* (都存在点击功能,可将两个点击功能效果抽象为事件(不同事件传入按钮,点击效果不同))
* */
public class Test {
public static void main(String[] args) {
//新建按钮
Button button=new Button();
//新建事件
EventBtn01 event01=new EventBtn01();
EventBtn02 event02=new EventBtn02();
//设置监听事件(点击按钮触发的事件)
button.setOnClickLisenter(event01);
//点击按钮
button.down();
}
}