本篇我们将学习面向对象中的接口和多态:
第一章:接口
1.1-接口概述(了解)
什么是接口
Java中的接口是 一系列方法的声明 ,是一些 方法特征的集合 。
一个接口 只有方法的特征(只有声明) 没有 方法的实现(没有方法体) ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)
如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是 封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8)。
总而言之,Java中的接口就是一系列方法声明的集合。
为什么需要接口
接口的优势:
- 是多态的基础
- 可以多实现(可以理解为多继承)
接口是一种引用数据类型
接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。
类和接口都是java代码,都会转换为字节码文件
public class 类名.java → 类名.class
public interface 接口名.java → 接口名.class
1.2-接口的定义格式(记忆)
定义格式:关键字 interface
public interface 接口名称 {
// 抽象方法
// 默认方法
// 静态方法
}
接口中定义抽象方法
抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
public interface InterFaceName {
public abstract void method();
}
接口中定义默认方法和静态方法
默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。
静态方法:使用 static 修饰,供接口直接调用。
public interface InterFaceName {
public default void method() {
// 执行语句
}
public static void method2() {
// 执行语句
}
}
1.3-接口的使用方式(记忆)
我们之前学习继承时,父类需要子类继承。而接口和继承中父类相似,也需要一个类似子类的实现类来实现接口。
接口的实现
类与 接口 的关系为实现关系,即 类实现接口 ,该类可以称为接口的 实现类 ,也可以称为 接口的子类 。
实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements 关键字。
非抽象类实现接口注意事项
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
子类实现接口格式
public class 类名 implements 接口名 {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【可选】
}
子类实现接口中的 抽象方法
对于接口中定义的抽象方法,子类必须全部实现(重写)。代码如下:
定义一个接口:LiveAble
public interface LiveAble {
// 定义抽象方法
public abstract void eat();
public abstract void sleep();
}
定义一个实现类:Animal
public class Animal implements LiveAble {
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void sleep() {
System.out.println("晚上睡");
}
}
定义一个测试类:Test
public class Test {
public static void main(String[] args) {
// 创建子类对象
Animal a = new Animal();
// 调用实现后的方法
a.eat();
a.sleep();
}
}
/*
输出结果:
吃东西
晚上睡
*/
子类使用或重写接口中的 默认方法
对于接口中的默认方法,子类可以继承,也可以重写,二选一,但是只能通过实现类的对象来调用。
直接使用默认方法,代码如下:
定义接口:LiveAble
public interface LiveAble {
public default void fly(){
System.out.println("天上飞");
}
}
定义实现类:Animal
public class Animal implements LiveAble {
// 继承,什么都不用写,直接调用
}
定义测试类:Test<