多态
代码中体现多态性,其实就是一句话:父类引用子类对象
格式:
父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
访问成员变量的两种方式:
1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找
2.间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找
在多态的代码中,成员方法的访问规则
看new是谁,就优先用谁,没有则向上找
口诀:编译看左边,运行看右边
成员变量:编译看左边,运行还看左边
成员方法:编译看左边,运行看右边
// 父类方法
public class Fu {
int num = 12;
public void showNum() {
System.out.println(num);
}
public void method() {
System.out.println("父类方法");
}
public void methodFu() {
System.out.println("父类特有方法");
}
}
// 子类方法
public class Zi extends Fu {
int num = 120;
int age = 19;
@Override
public void showNum() {
System.out.println(num);
}
@Override
public void method() {
System.out.println("子类方法");
}
public void methodZi() {
System.out.println("子类特有方法");
}
}
public class Demo02MultiMethod {
public static void main(String[] args) {
Fu obj = new Zi();
obj.method();
obj.methodFu();
// 错误写法,编译看左边,左边是Fu,没有methodZi方法,所有报错
// obj.methodZi();
}
}
如何才能知道一个父类的引用对象,本类是什么子类
格式:
对象 instanceof 类名称
这将会得到一个boolean值的结果,也就是判断前面的对象能不能当中后面类型的实例。
向上转型与向下转型
// 动物抽象类
public abstract class Animal {
public abstract void eat();
}
// 猫子类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catchMouse() {
System.out.println("猫抓老鼠");
}
}
public class Demo01Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
// 向下转型
Cat cat = (Cat) animal;
cat.catchMouse();
}
}
笔记本USB接口案例
// USB抽象接口
public abstract 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 class DemoMain {
public static void main(String[] args) {
// 创建一个笔记本电脑
Computer computer = new Computer();
computer.powerOn();
// 向上转型
USB usbMouse = new Mouse();
computer.useDevice(usbMouse);
// 创建一个USB键盘
Keyboard keyboard = new Keyboard();
computer.useDevice(keyboard);
computer.powerOff();
}
}