想了解更多请查看java学习(idea版)
目录
多态
面向对象三大特性:封装、继承、多态
多态: 是指同一行为,具有多个不同表现形式
多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展。
多态的体现
- 父类引用指向子类对象
- 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
父类类型 变量名 = new 子类对象;//父类引用指向子类对象
变量名.方法名();
列:实现多态
多态中的成员变量、成员方法
- 当访问成员变量时,看等号左边时谁,优先用谁在多态中,
- 当访问成员方法时,父子类都此方法,用子类方法;子类没有此方法,用父类方法
在多态中,当访问成员方法时,父子类都此方法,用子类方法;子类没有此方法,用父类方法
引用类型转换
多态中引用类型转换分为向上转型和向下转型
向上转型
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
向下转型
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
instanceof
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验
instanceof格式 得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例
对象 instanceof 类名称
列:向上转型、向下转型、instanceof使用
为了解决向下转型出现java.lang.ClassCastException类转换异常,可以使用instancefo
/**
格式:
对象 instanceof 类名称
这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
/
public class Demo02Instanceof {
public static void main(String[] args) {
Animal animal=new Dog();
animal.eat();
// if(animal instanceof Animal){
// Dog dog=(Dog)animal;
// dog.watchHouse();
// }else if (animal instanceof Cat){
// Cat cat=(Cat)animal;
// cat.catchMouse();
// }
giveObject(animal);
}
public static void giveObject(Animal animal){
if(animal instanceof Animal){
Dog dog=(Dog)animal;
dog.watchHouse();
}else if (animal instanceof Cat){
Cat cat=(Cat)animal;
cat.catchMouse();
}
}
}
列:接口多态的综合案例
接口
public interface USB {
public abstract void open(); // 打开设备
public abstract void close(); // 关闭设备
}
接口实现类 鼠标
public class Mouse implements USB {
@Override
public void open() {
System.out.println("打开鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
public void click() {
System.out.println("鼠标点击");
}
}
接口实现类 键盘
public class Keyboard implements USB {
@Override
public void open() {
System.out.println("打开键盘");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
public void type() {
System.out.println("键盘输入");
}
}
电脑类 实现对鼠标、键盘接口的配置
public class Computer {
public void powerOn() {
System.out.println("笔记本电脑开机");
}
public void powerOff() {
System.out.println("笔记本电脑关机");
}
// 使用USB设备的方法,使用接口作为方法的参数
public void useDevice(USB usb) {
usb.open(); // 打开设备
if (usb instanceof Mouse) { // 一定要先判断
Mouse mouse = (Mouse) usb; // 向下转型
mouse.click();
} else if (usb instanceof Keyboard) { // 先判断
Keyboard keyboard = (Keyboard) usb; // 向下转型
keyboard.type();
}
usb.close(); // 关闭设备
}
}
测试
public static void main(String[] args) {
// 首先创建一个笔记本电脑
Computer computer = new Computer();
computer.powerOn()
// 准备一个鼠标,供电脑使用
USB usbMouse = new Mouse(); //向上转型 多态写法 // Mouse mouse = new Mouse();
// 参数是USB类型,我正好传递进去的就是USB鼠标
computer.useDevice(usbMouse);
// 创建一个USB键盘
Keyboard keyboard = new Keyboard(); // 没有使用多态写法
// 方法参数是USB类型,传递进去的是实现类对象
computer.useDevice(keyboard); // 正确写法!也发生了向上转型
// 使用子类对象,匿名对象,也可以
// computer.useDevice(new Keyboard()); // 也是正确写法
computer.powerOff();
System.out.println("==================");
}
结果