多态
接口
- 定义: 接口是一种约定规范,是多个抽象方法的集合.仅仅只是定义了应该有哪些功能,本身不实现功能,至于每个功能具体怎么实现,就交给实现类完成.
- 接口中的方法全部是抽象方法,接口实现类必须重写所有的抽象方法,否则只能定义成抽象类
- 接口中的方法是抽象方法,不提供功能实现,体现了规范和实现相分离的思想,也体现了组件之间低耦合的思想.
接口与接口之间的继承
// 定义接口,接口名习惯以大写的I开头,如接口IUsb,ISpeak,ISee
public interface 接口名 {
抽象方法;
}
// 接口之间可以存在多继承的方法,假设已有接口ISpeak,ISee
public interface extends ISpeak, ISee { // 接口之间可以多继承
抽象方法; // 同时继承了ISpeak,ISee中的抽象方法
}
接口与实现类
// 接口与实现类
public interface ISpeak { // 定义接口
void speak(); // 抽象方法,只定义,不实现
}
// 实现类
public class Person implements ISpeak { // 接口实现类
public void speak() { // 重写ISpeak接口中的speak()方法
System.out.println("我会说英语!");
}
}
注:
- 接口实现类可以同时继承抽象类和实现接口,写法顺序是先写继承,再写接口,如:
Public class Person extends Animal implements ISpeak {} - 实现类必须重写接口中的所有抽象方法,否则只能定义成抽象类
- 接口中必须全为抽象方法(可以定义常量)
多态
- 定义: 同一个对象拥有多种形态,也就是说一个抽象方法有很多重写的方法,产生不同的执行效果
- 抽象类和接口都可以体现多态,它们中的抽象方法可以被重写出很多不同的功能
- 多态情况下的访问流程: 编译时期先去父类找是否存在该方法,如果没有则报错;运行时期在父类中找到了该方法再去子类中寻找,如果找不到则访问父类中的方法,如果找到了就执行子类中的方法
类型转换
// 多态的类型转换,以抽象类为例
// 抽象动物类,抽象方法是走路功能
public abstract class Animal {
public abstract void walk();
}
// 抽象人类,继承抽象动物类,多了写字的抽象方法
public abstract class Person extends Animal {
public abstract void write();
}
// 抽象外国人,继承人类,多了说外语的抽象方法
public abstract class Foreigner extends Person {
public abstract void speak();
}
// 人们类(抽象类的子类),重写抽象类的抽象方法
public class People extends Foreigner {
public void Walk() {
System.out.println("我会走路!");
}
public void write() {
System.out.println("我会写字!");
}
public void speak() {
System.out.println("我会说英语!");
}
}
// 测试类Demo
public class Demo {
public static void main(String[] args) {
Animal animal= new People();
//用抽象父类Animal作为对象的接收类型只能访问到Animal类中的walk()方法,无法访问到write方法
animal.walk();
// animal.write(); 报错
// 这个时候想要访问write方法可以使用类型强制转换
Person person = (Person) animal;
person.write(); // 强制转换以后就可以访问了
}
}
多态的好处
- 程序不用为每个子类(接口实现类)编写功能调用,只需要对抽象父类(接口)进行处理即可,大大提高了程序的可复用性
- 子类的功能可以被父类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性.(多态真正的作用)
多态的USB案例
- 需求: 模拟在主板上安装鼠标、键盘等.
- 实现:
// 鼠标,键盘都有工作的功能,规范方法,使用接口
public interface IUsb {
void work();
}
// 鼠标实现功能
public class Mouse implements {
public void work() { // 重写抽象方法
System.out.println("鼠标在移动");
}
}
// 键盘实现功能
public class Keyboard implements {
public void work() {
System.out.println("键盘在打字");
}
}
// 主板上安装键盘和鼠标
public class Motherboard {
// IUsb类型可以接受实现类对象
public void plugin(IUsb usb) {
usb.work();
}
}
// 测试类
public class TestDemo {
public static void main(String[] args) {
// 创建主板对象
Motherboard b = new Motherboard();
// 创建鼠标对象
Mouse m = new Mouse();
// 创建键盘对象
keyboard k = new Keyboard();
// 在键盘上安装鼠标
b.plugin(m);
// 在键盘上安装键盘
b.plugin(k);
}
}