- 多态的前提1:是继承
- 多态的前提2:要有方法的重写
- 父类引用指向子类对象,如:Animal a = new Cat();
- 多态中,编译看左边,运行看右边
关于编译看左,运行看右的解释
对于多态中的非静态方法,编译看左,运行看右。也就是在编译期间看左边的类中有无该方法,而实际在运行时执行的是右边类的方法。如果编译期间没有在左边的类找到该非静态域,则会报编译错误(调用左边的属性,调用方法时若子类没有重写则调用左边的,若右边的重写了调用的方法,则优先调用右边的。)(主体在左,重写法看右)
静态方法,编译和运行全看左边(及创建对象只与左边有关系,是左边的类型)
1.这是中间程序运行结果
2.这是最右边程序运行结果
可以看出来静态方法都是调用左边的。
下面看非静态
1.属性
可以看到我Person Teacher和Student都定义了a
分别是300 200和100
此时我定义a和b用Person类定义,用Student和Teacher实例化
输出a.a和a.b都是300
可见
调用属性只与左边有关
2.方法
三个类Student 和Teacher是Person的子类
package oop.towho;
public abstract class Application {
public static void main(String[] args) {
Person person = new Person();
Teacher teacher = new Teacher();
Student student = new Student();
//父类的引用指向子类的对象
Person a = new Teacher();//Teacher类对象的地址值交给父类型变量a来保存
Person b = new Student();//Student类对象的地址值交给父类型变量b来保存
person.work();//主要是活着:父类调用自己的方法
teacher.work();//主要工作是教学:子类调用自己的方法
student.work();//主要工作是学习:子类调用自己的方法
a.work();//主要工作是教学,多态对象使用的是父类的定义,子类的方法体
b.work();//主要工作是学习,多态对象使用的是父类的定义,子类的方法体
}
}
多态的好处
!多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法!
提高了程序的可扩展性和可维护性



