文章目录
接口 - Interface
接口就是一种公共的规范标准,只要符合规范标准,就可以通用
接口是一种引用数据类型,最重要的内容就是其中的抽象方法
定义接口
创建.class
时选择 Interface
选项
public interface 接口名称{
//接口内容
}
接口中可以包含
- 常量
- 抽象方法(最重要)
- 默认方法
- 静态方法
- 私有方法(JAVA9 only)
注意事项:
- 接口当中的抽象方法,修饰符必须是两个固定的关键字
public abstract
- 关键字修饰符可以省略(省略任意一个、省略两个都可以)
- 方法的三要素(
方法名
、参数列表
、返回值
)可以随意定义
使用接口
使用步骤
- 使用时,必须有一个实现类来实现该接口
- 接口的实现类必须
override
接口中所有的抽象方法 - 创建实现类的对象
如果实现类中没有
override
接口中所有的抽象方法,那么这个实现类自己就必须是抽象类
接口中的抽象方法
public abstract 返回值类型 方法名称(参数){
System.out.println("这是默认方法");
}
实现类必须override所有的抽象方法,除非实现类本身就是抽象类
接口中的默认方法
在接口中要是添加了新的抽象方法,实现类需要修改,则可以使用接口中的默认方法来解决接口升级的问题
public default 返回值类型 方法名称(参数){
System.out.println("这是默认方法");
}
- 接口的默认方法,可以通过接口实现类直接调用
- 接口的默认方法,也可以通过接口实现类override并调用
接口中的静态方法
在定义静态方法时和默认方法类似,将default改为static即可
//开始定义静态方法。
public static 返回值类型 方法名称(参数){
System.out.println("这是静态方法");
}
注意事项
-
不能通过接口实现类的对象来调用接口当中的静态方法
-
通过接口名称可以直接调用静态方法
静态和对象没关系!!!!
接口中的私有方法 (Java 9 以上)
在定义静态方法时和默认方法类似,将default改为private即可
-
普通私有方法
private 返回值类型 方法名(参数)
-
静态私有方法
private static 返回值类型 方法名(参数)
接口中的常量
使用 public static final
来修饰,从效果上看,这其实就是接口的常量 (类似成员变量)
注意事项
- 接口中的常量必须进行赋值
- 一旦使用final关键字进行修饰,说明不可变,其实这三个修饰符也是都可以省略的
- 接口中常量的名称,推荐使用完全大写的字母来命名
多态 - Polymorphism (Multi)
概念及访问规则
面向对象的三大特征:封装性、继承性、多态性
多态是指多种形态,继承是多态的前提
多态是父类引用指向子类对象(左父右子)
访问成员变量的规则
- 直接通过对象名访问成员变量,看等号左边是谁,则优先用谁,没有则向上找
- 间接通过成员方法访问
- 编译看左边,运行看左边
访问成员方法的规则
-
在多态的代码中,看new的是谁,就优先用谁,没有则向上找
-
编译看左边,运行看右边
使用格式
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();
多态的优点:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化
上下转型
向上转型 - 父类引用指向子类对象
格式:父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把他当作父类来使用
注意事项:向上转型一定是安全的,因为是从小范围转成了大范围
但是对象一旦转型为父类,那么就无法调用子类特有的内容
解决方法—> 使用向下转型
public static void main(String[] args) {
Animal animal = new Cat(); //左父右子,这是一个典型向上转型 ,意为创建一只猫,把它视为动物
animal.eat();
}
向下转型 - 还原
格式:子类名称 对象名 = (子类名称)父类对象;
含义:将父类对象,还原为本来的子类对象
必须保证对象本来创建的时候就是狗,才能还原为狗,不能还原为猫
那么我怎么知道他本来是猫还是狗呢?
使用 instanceof 来判断
假设鼠标和键盘都是USB的子类,而鼠标和键盘有特有的方法 click
和type
想要使用computer
来调用USB接口的方法,在computer类
里面定义好识别到usb对象时需要判断是鼠标还是键盘
public void UseDevice(USB usb) {
if (usb instanceof Mouse) {
Mouse mouse = (Mouse) usb; //向下转型来调用特有的方法
mouse.click();
}
if (usb instanceof Keyboard) {
Keyboard keyboard = (Keyboard) usb; //向下转型来调用特有的方法
keyboard.type();
}
}
在使用向下转型的时候一定要用
instanceof
来作判断重要的是能够用接口来作为方法的参数