2.1.2 什么是接口
接口在JAVA编程语言中是一个抽象类型,通常以interface来声明。
从面向对象编程的角度,可以将接口理解为对不同类型的事物的共同的行为特征的抽象。例如,鹰和飞机属于不同类型的事物,但是都有飞行的行为特征。
2.1.3 接口和抽象类
抽象类和接口都属于抽象的概念,它们有一些区别,可以从同类别和跨类别的角度来考虑:
- 同一种类别的公共行为和属性可以抽取到抽象类中。抽象类用于表示一种具有共性的类,可以包含实现的方法和具体的属性。比如,对于喜鹊和老鹰这两种鸟类,它们都属于鸟类的范畴,可以将它们共同的行为和属性抽象到一个抽象类(如Bird)中,以实现代码的重用和扩展。
- 不同种类的公共行为可以抽取到接口中。接口用于定义一组相关的方法,用于表示某种能力或行为。比如,喜鹊、老鹰和飞机都具有起飞和着陆的功能,但它们并不属于同一种类,此时可以将与飞行相关的共同行为抽取到一个接口(如Flyable)中,不同类别的对象可以通过实现该接口来具备飞行的能力。
根据以上原则,对于喜鹊来说,它可以继承自抽象类Bird,以获取鸟类的共性属性和行为,并且还可以实现接口Flyable,以具备飞行的能力。
抽象类和接口的设计原则:
- 将所有子类共有的方法抽象化到父类中,可以使用抽象类。
- 将部分子类中的公共方法抽象化到接口中,适用于不同类别但具有相似行为的对象。
通过合理地使用抽象类和接口,可以实现代码的复用和扩展,并且更好地表示对象之间的关系和行为。选择使用抽象类还是接口取决于具体的设计需求和对象之间的关系。
2.2.1 接口的语法
使用interface定义接口:
1、接口中只能定义常量和方法
- 可以省略常量的修饰词 public static final
- 可以省略抽象方法修饰词 public abstract
2、接口不能实例化创建对象,
3、接口只能被继承,作为父类型被子类型实现
比如,定义飞行接口:
- 包含常量ID
- 包含 3 个抽象方法
一个类可以实现多个接口:实现的接口直接用逗号分隔。
定义接口 Flyable 和类 Bird,并类 Plane实现接口Flyable,以及类 Eagle 继承Bird并实现Flyable;编写代码测试接口的用法。
案例示意代码如下所示:
- package oop_04.interface01;
- /**
- * 飞行接口
- */
- public interface Flyable {
- int ID = 1;
- /**
- * 起飞
- */
- void takeOff();
- /**
- * 飞行
- */
- void fly();
- /**
- * 着陆
- */
- void land();
- }
- package oop_04.interface01;
- public class Plane implements Flyable{
- @Override
- public void takeOff() {
- System.out.println("Plane takeOff...");
- }
- @Override
- public void fly() {
- System.out.println("Plane fly...");
- }
- @Override
- public void land() {
- System.out.println("Plane land...");
- }
- }
- package oop_04.interface01;
- public class Bird {
- public void eat(){
- System.out.println("eat...");
- }
- public void sleep(){
- System.out.println("sleep...");
- }
- }
- package oop_04.interface01;
- public class Eagle
- extends Bird implements Flyable{
- @Override
- public void takeOff() {
- System.out.println("Eagle takeOff...");
- }
- @Override
- public void fly() {
- System.out.println("Eagle fly...");
- }
- @Override
- public void land() {
- System.out.println("Eagle land...");
- }
- }
- package oop_04.interface01;
- public class InterfaceDemo1 {
- public static void main(String[] args) {
- // Flyable flyable=new Flyable(); // 接口不可被实例化
- System.out.println(Flyable.ID); // 接口中定义的是静态常量
- Flyable eagle = new Eagle(); // 接口类型引用指向实现类的对象
- eagle.fly(); // 实际执行实现类重写的方法逻辑
- Flyable plane = new Plane(); // 接口类型引用指向实现类的对象
- plane.fly(); // 实际执行实现类重写的方法逻辑
- // eagle.eat(); // 无法访问实现类特有的方法
- }
- }