多态
多态,一个事务具备的不同形态就是多态
- 实例:
- 在教室,学习形态
- 逛超市,顾客形态
- 救落水孩子.英雄形态
对象的多态性
-
多态前提
- 要有继承,或者接口实现
- 要方法的重写
- 父类或者接口的引用变量指向子类或者实现类对象
-
子类父类多态实现
-
public class PloymorphismTest { public static void main(String[] args) { //实现子类继承父类,多态程序 //学生是一个人 //父类或者接口的引用变量指向子类或者实现类对象 //父类引用等于子类对象 Person person=new Student(); person.eat(); } }
public class Person { public void eat() { System.out.println("任吃"); } }
public class Student extends Person{ public void eat() { System.out.println("学生吃"); } }
-
抽象类和子类
public class PloymorphismTest { public static void main(String[] args) { // Animal animal=new Cat(); animal.eat(); } }
public abstract class Animal { public abstract void eat() ; }
ublic class Cat extends Animal { public void eat() { System.out.println("猫吃死"); } }
-
接口和实现类
public class PloymorphismTest {
public static void main(String[] args) {
//
MyInterface myInterface=new MyInterfanceple();
myInterface.inter();
}
}
public interface MyInterface {
public abstract void inter();
}
public class MyInterfanceple implements MyInterface {
public void inter() {
System.out.println("太快了");
}
}
多态实现细节
- 多态的程序中,子类父类中成员变量的特点
- 编译期,看父类是否有这个变量,有则成功,没则失败
- 运行期,运行父类的变量
- 多态程序中,子类父类成员方法的特点
- 编译期,看父类是否有这个方法,有则成功,没则失败
- 运行期:运行子类的方法重写
- 小总结 fu f= new zi();
- 变量:编译看左边,运行看左边
- 方法:编译看左边,运行看右边
为什么编译时父类,运行是子类(成员方法)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6Vs5XkU-1595509103667)(C:\Users\15272\Desktop\笔记\笔记照片\方法运行.png)]
多态转型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISpAmj4K-1595509103671)(C:\Users\15272\Desktop\笔记\笔记照片\多态转型.png)]
类型转换时候出现的异常问题
类型转换异常
public static void main(String[] args) {
/*
* 多态创建对象
* Cat和Dog都继承Animal
* 调用子类父类的共性内容eat()
* 调用不了,子类特有的内容,catchMouse(),lookHome();
* */
Animal a=new Dog();
//类型强制转换,向下转型,已经提升为Animal类型的cat对象,强制转换为Dog类型
a.eat();
Cat c=(Cat) a;
//对象c 调用Cat类的特有成员,共有成员
c.catchMouse();
}
解决异常的出现:关键是要转换的对象a上,判断出a这个引用,是Dog对象还是
Cat对象
-
运算符 instanceof 作比较
-
比较的结果是布尔类型
-
instanceof 比较出,a到底是哪个类的对象
-
语法
引用类型变量 instanceof 类名 例子 a instanceof cat 含义 a是不是Cat的对象
-
多态案例(接口多态案例)
需求:有一台笔记本电脑,笔记本上面有接口,usb是真实存在的接口,使用笔记本的人可以直接向接口连接一下设备,鼠标键盘,…
笔记本的厂家,不会预先想到USB接口会连接一些哪些设备
设计一台笔记本电脑,出现USB接口,可以连接任意的外接设备
核心技术,方法的参数是接口类型,调用方法传递实现类对象,多态调用,执行实现类的重写方法
package Ploymorphism03;
//接口
public interface USB {
public abstract void open();
public abstract void close();
}
//实现类
public class Mouse implements USB{
public void open() {
System.out.println("鼠标开机");
}
public void close() {
System.out.println("鼠标关机");
}
}
//实现类
public class Keyboard implements USB{
public void open() {
System.out.println("键盘开机");
}
public void close() {
System.out.println("键盘关机");
}
}
public class Computer {
public void use(USB u) {
u.open();
u.close();
}
}
public class Test {
public static void main(String[] args) {
Computer computer=new Computer();
computer.use(new Mouse());
computer.use(new Keyboard());
}
}