1、认识多态
- 面向对象三大特征:封装、继承、多态
什么是多态?
- 同类型的对象,表现出不同的形态。(对象的多种形态。)
多态的表现形式?
父类类型 对象名称 = 子类对象; 多态的前提?
- 有 继承 / 实现 关系;
- 有父类引用指向子类对象
- 有方法重写
多态的好处?
- 使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println(name + "," + age); } } class Student extends Person { @Override public void show() { System.out.println("学生的信息位:" + getName() + ", " + getAge()); } } class Teacher extends Person { @Override public void show() { System.out.println("老师的信息为:" + getName() + ", " + getAge()); } } class Administrator extends Person { @Override public void show() { System.out.println("管理员的信息为:" + getName() + ", " + getAge()); } } class Test { public static void main(String[] args) { // 创建三个对象,并调用register方法 Student s = new Student(); s.setName("张三"); s.setAge(18); Teacher t = new Teacher(); t.setName("王建国"); t.setAge(20); Administrator admin = new Administrator(); admin.setName("管理员"); admin.setAge(35); register(s); register(t); register(admin); } // 这个方法既能接收老师,又能接收学生,还能接收管理员 // 只能把参数写成这三个类型的父类 public static void register(Person p) { p.show(); } } D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=33418:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\oop-polymorphism com.itheima.Test 学生的信息位:张三, 18 老师的信息为:王建国, 20 管理员的信息为:管理员, 35 Process finished with exit code 0
2、多态调用成员的特点
变量调用:编译看左边,运行也看左边。 编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
运行看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
方法调用:编译看左边,运行看右边。 编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
运行看右边:java运行代码的时候,实际上运行的是子类中的方法。
Animal a = new Dog();
现在用 a 去调用变量和方法的呀?是的
而a是Animal类型的,所以默认都会从Animal这个类中去找
//成员变量:在子类的对象中,会把父类的成员变量也继承下的的。父:name 子:name
//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
3、多态调用成员的内存图解
首先第一步测试类的字节码文件先加载到方法区当中,然后虚拟机会自动的去调用main方法,然后会先加载父类的字节码文件,然后会再加载子类的字节码文件。
4、多态的优势和弊端
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
- 定义方法的时候,使用 父类型 作为参数,可以接收所有子类对象,体现多态的扩展性与便利。