1、 概念
同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征
2、多态的形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
3、多态的识别技巧
对于方法的调用:编译看左边,运行看右边。(运行用子类的方法)
对于变量的调用:编译看左边,运行看左边。(运行用父类的变量)
调用的是方法,运行出来的是构造器右边那个类的方法
调用的是变量,不管子类有没有那个变量,结果都是构造器左边那个类的变量
4、多态的使用前提
(1)必须存在继承或者实现关系。
(2)必须存在父类类型的变量引用子类类型的对象。
(3)需要存在方法重写。
public class PolymorphicDemo {
public static void main(String[] args) {
// 父类类型 对象名称 = new 子类构造器;
Animal dlam = new Cat();
dlam.run();
System.out.println(dlam.name);
Animal taiDi = new Dog();
taiDi.run();
System.out.println(taiDi.name);
}
}
class Dog extends Animal{
public String name = "Dog";
@Override
public void run(){
System.out.println("Dog跑的贼快~~~~!");
}
}
class Cat extends Animal{
public String name = "Cat";
@Override
public void run(){
System.out.println("Cat跑的飞快~~~~!");
}
}
class Animal{
public String name = "Animal";
public void run(){
System.out.println("动物跑!");
}
}
5、多态的优劣势
(1)优势:
① 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦。
② 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利。
(2)劣势:
① 多态形式下,不能直接调用子类特有的功能。编译看左边!! 左边父类中没有子类独有的功能,所以代码在编译阶段就直接报错了!
public class PolymorphicDemo {
public static void main(String[] args) {
// 父类类型 对象名称 = new 子类构造器;
Animal dlam = new Dog();
dlam.run(); // 对于方法的调用:编译看左边,运行看右边。
// dlam.lookDoor(); // 报错了,多态形式下,编译看左边,左边没有独有功能
Animal taidi = new Dog();
go(taidi);
Animal tom = new Cat();
go(tom);
}
// 开发一个游戏 所有动物都可以进来比赛
public static void go(Animal d){
System.out.println("开始。。");
d.run();
System.out.println("结束。。");
}
}
class Dog extends Animal{
@Override
public void run(){
System.out.println("Dog跑的贼快~~~~!");
}
// 独有功能
public void lookDoor(){
System.out.println("Dog看门");
}
}
class Cat extends Animal{
@Override
public void run(){
System.out.println("Cat跑的飞快~~~~!");
}
// 独有功能
public void catchMouse(){
System.out.println("Cat抓mouse");
}
}
class Animal{
public void run(){
System.out.println("动物跑!");
}
}
6、引用类型自动类型转换
(1)小范围类型的变量或者值可以直接赋值给大范围类型的变量。
(2)大范围类型的变量或者值必须强制类型转换给小范围类型的变量。
public class PolymorphicDemo {
public static void main(String[] args) {
// 1.引用类型的自动类型转换:小范围的对象赋值给大范围的变量
Animal a = new Cat();
// 2.引用类型的自动类型转换:小范围的变量赋值给大范围的变量
Cat c = new Cat();
Animal a1 = c;
}
}
class Animal{
}
class Cat extends Animal{
}