目录
Java多态
-
多态(多种状态)基本介绍
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
-
多态是方法的多态,与属性无关。
-
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,但子类没有重写父类的方法,则调用父类的方法,否则调用子类重写父类的方法。
-
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
-
多态分为两种:
1.编译时多态:是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,在运行时谈不上多态。
2.运行时多态:是动态的,由于方法重写,所以想要确定引用变量所调用的方法的入口,必须根据运行时的引用变量所指向的实例对象来确定。从而使得同一个引用变量调用同一个方法,但不同的实例对象表现出不同的行为。我们通常所说的多态指的都是运行时多态。
多态的三个必要条件:
-
要有继承
-
要有方法重写
-
父类的引用指向子类的对象(向上转型)
多态的具体体现
1.方法的多态
-
方法重载体现多态
2.对象的多态
老韩重要的几句话(记住):
-
一个对象的编译类型和运行类型可以不一致。
例如:Animal animal = new Dog(); (animal的编译类型是Animal,运行类型是Dog)
2.编译类型在定义对象时,就确定了,不能改变。
3.运行类型是可以变化的。
例如:Animal animal = new Dog(); (animal的编译类型是Animal,运行类型是Dog)
animal = new Cat(); (animal的运行类型变成了Cat,编译类型仍然是Animal)
4. 编译类型看定义时 = 号的左边,运行类型看 = 号的右边
例1:
package test.Demo03;
public class Animal {
public void cry() {
System.out.println("Animal cry() 动物在叫");
}
}
package test.Demo03;
public class Dog extends Animal {
@Override
public void cry() {
System.out.println("Animal cry() 小狗汪汪叫");
}
}
package test.Demo03;
public class Cat extends Animal {
@Override
public void cry() {
System.out.println("Animal cry() 小猫喵喵叫");
}
}
package test;
import test.Demo03.Animal;
import test.Demo03.Cat;
import test.Demo03.Dog;
public class Application {
public static void main(String[] args) {
//父类的引用指向子类的对象
Animal animal = new Dog(); //animal 编译类型是 Animal ,运行类型是 Dog
animal.cry(); //执行到改行时,animal的运行类型是Dog,所以cry就是Dog的cry
//父类的引用指向子类的对象
animal = new Cat(); //animal 编译类型是 Animal ,运行类型是 Cat
animal.cry();
}
}