思维导图
一、什么是接口
接口代表一种能力或约束
Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。
interface MyInterface {
void method();
}
- 接口没有构造方法
- 只能定义公开静态常量、公开抽象方法
- 使用
interface
关键字定义接口
接口的好处
- 程序耦合度降低
- 更自然的使用多态
- 设计与实现完全分离
- 更容易搭建程序框架
- 更容易更换具体实现
二、接口与类
2.1 类实现单个接口
定义一个接口
/**
* 接口。
* @author 张宝旭
*/
public interface MyInterface {
// 定义公开静态常量
public static final String NAME = "zbx";
Integer AGE = 21; // 前面的 public static final 可以省略,默认存在
// 定义公开静态方法
public abstract void show();
void run(); // 前面的 public abstract 可以省略,默认存在
}
实现接口
使用 implements
实现接口,必须重写接口中的所有方法
/**
* 接口实现类。
*
* @author 张宝旭
*/
public class MyInterfaceImpl implements MyInterface{
@Override
public void show() {
System.out.println("show");
}
@Override
public void run() {
System.out.println("run");
}
}
测试
使用接口去创建一个实例:同父类一样,接口也可声明为引用,并指向实现类对象。
- 仅可调用接口中所声明的方法,不可调用实现类中独有的方法
- 可强转回实现类本身类型,进行独有方法调用
/**
* 接口测试。
*
* @author 张宝旭
*/
public class MyInterfaceTest {
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl();
myInterface.show();
myInterface.run();
}
}
2.2 类实现多个接口
实现多继承接口:中间用逗号隔开
/**
* 接口实现类。
*
* @author 张宝旭
*/
public class MyInterfaceImpl implements MyInterface, Flyable{
@Override
public void show() {
System.out.println("show");
}
@Override
public void run() {
System.out.println("run");
}
@Override
public void fly() {
System.out.println("fly");
}
}
2.3 接口继承接口
/**
* 接口。
* @author 张宝旭
*/
public interface MyInterface extends Flyable, Swimable{
}
2.4 接口的多态
使用不同引用创建的对象,访问权限也不同
/**
* 接口测试。
*
* @author 张宝旭
*/
public class MyInterfaceTest {
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl();
myInterface.run(); // 只能调用run()方法
Flyable flyable = new MyInterfaceImpl();
flyable.fly(); // 只能调用fly()方法
Swimable swimable = new MyInterfaceImpl();
swimable.swim(); // 只能调用swim()方法
MyInterfaceImpl myInterface1 = new MyInterfaceImpl();
myInterface1.run(); // 可以调用全部方法,包括自己特有的方法
myInterface1.fly();
myInterface1.swim();
myInterface1.eat();
}
}
2.5 常量接口
将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统 一管理,提高代码可读性
public interface ConstInterface {
String NAME = "zbx";
Integer AGE = 21;
}
2.6 标记接口
不实现任何内容,仅作为标记
public interface LabelInterface {
}
三、接口与抽象类的区别
相同
- 可编译成字节码文件
- 不能创建对象
- 可以作为引用类型
- 具备Object类中所定义的方法
不同
- 接口中的变量只能定义成
public static final
类型的,抽象类中的变量与普通类相同 - 接口中的方法都为抽象方法,抽象类中可以有非抽象方法
- 接口中没有构造方法、动态代码块、静态代码块
- 接口中JDK1.8之后可以定义static方法和default方法
详细讲解:实例分析Java接口和抽象类的区别,以及如何去使用它们(JDK1.8 新版本)
四、接口的规范
ᕙ༼ຈلﻝ͜ ຈ༽ᕗI’m the power
当定义的接口表示一种能力时,应定义成以 able 结尾的名字
/**
* @author 张宝旭
*/
public interface Flyable {
void fly();
}
- 任何类在实现接口时,必须实现接口中所有的抽象方法
- 实现接口中的抽象方法,访问修饰符必须是 public