多态的好处
多态:
- 值同一行为,具有多个不同的变现形式
前提
- 继承或者实现(父类、抽象类、接口)【二选一】
- 方法的重写【意义体现】
- 父类引用指向子类对象【格式体现】
格式
父类类型 变量名 = new 子类对象(参数列表);
父类类型\<泛型\> 变量名 = new 子类对象\<\>(参数列表);
父类类型:指子类对象继承父类类型,或者实现的父类接口类型。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译报错;如果有,执行的是子类重写(继承)后的方法
多态的好处:
实际开发中,父类类型作为方法形式的参数,传递子对象给方法,进行方法调调用,更能体现书多态的扩展性与便利。
引用类型转换
向上转型:多态本身就是子类类型向父类类型向上转换的过程,这个过程是默认的。当父类型引用指向一个子类对象时,便是向上转型。
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。 一个已经向上转型的子对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
子类类型 变量名 = (子类类型) 父类变量名;
为什么要转型?
当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译报错,也就是说,多态不能调用子类拥有而父类没有的方法,这也就是 多态的不足,这就需要向下转型,调用子类独有的方法。
转型验证instanceof: 变量名 instanceof 数据类型
如果变量属于该数据类型,返回true,否则返回false,可以在向下转型的时候进行判断
接口与多态的栗子:
- USB接口
public interface USB {
void open();
void close();
}
- Mouse鼠标类
public class Mouse implements USB {
public Mouse() {}
@Override
public void open() {
System.out.println("插上了鼠标线");
}
@Override
public void close() {
System.out.println("鼠标线被拔掉了");
}
public void click() {
System.out.println("鼠标点击事件");
}
}
- KeyBord键盘类
public class KeyBord implements USB {
@Override
public void open() {
System.out.println("键盘线插上了");
}
@Override
public void close() {
System.out.println("键盘线被拔了");
}
public void tupe() {
System.out.println("我在使用键盘打字");
}
}
- Laptop笔记本类
public class Laptop {
public void run() {
System.out.println("笔记本系统开启了。。。。");
}
public void useUSB(USB usb) {
if(usb != null) {
// 多态(向上转型)
usb.open();
// 向下转型
if(usb instanceof Mouse) {
Mouse mouse = (Mouse) usb;
mouse.click();
} else if( usb instanceof KeyBord) {
KeyBord keyBord = (KeyBord) usb;
keyBord.tupe();
}
// 多态
usb.close();
}
}
public void shutDown() {
System.out.println("系统关闭。。。。。");
}
}
- Main测试类
public class Main {
public static void main(String[] args) {
Laptop laptop = new Laptop();
Mouse mouse = new Mouse();
KeyBord keyBord = new KeyBord();
laptop.run();
laptop.useUSB(mouse);
laptop.useUSB(keyBord);
laptop.shutDown();
}
}