Java—多态
目录
1、认识多态
2、多态的好处和存在的问题
2.1使用多态的好处
2.2多态存在的问题
3、多态下的类型转换
4、综合案例—支付模块
1、认识多态
多态是在继承/实现下的一种现象,表现为:对象多态,行为多态。
对象多态
- 对象多态是面向对象编程中的重要概念,允许父类引用指向子类对象。
- 语法形式:Animal a1 = new Wolf();例如下面代码就是对象多态。
行为多态
- 行为多态是面向对象编程中的核心概念,指的是同一个方法调用在不同对象上表现出不同的行为。
Animal 类
public class Animal {String name = "动物";public void run(){System.out.println("动物会跑~~~");}
}
Wolf 类
public class Wolf extends Animal{String name = "狼";@Overridepublic void run(){System.out.println("狼跑的贼快~~~");}
}
Tortoise 类
public class Tortoise extends Animal {String name = "乌龟";@Overridepublic void run(){System.out.println("乌龟跑得慢");}
}
Test类:测试类
public class Test {public static void main(String[] args) {//1、对象多态,行为多态Animal a1 = new Wolf();Animal a2 = new Tortoise();a1.run();//编译看左边,运行看右边。编译看Animal运行看 Wolfa2.run();//编译看左边,运行看右边System.out.println(a1.name);//成员变量,编译看左边,运行看左边System.out.println(a2.name);//成员变量,编译看左边,运行看左边}
}
/*
输出结果:
狼跑的贼快~~~
乌龟跑得慢
动物
动物*/
2、多态的好处和存在的问题
2.1使用多态的好处
- 好处1:在多态形式下,右边对象是解耦合的,更便于扩展和维护。

解耦合的概念:解耦合是指降低软件组件之间的依赖关系,使各个模块尽可能独立,减少相互影响
- 好处2:定义方法时:使用父类类型的形参,可以接收一切子类对象、扩展性强更便利。
2.2多态存在的问题
- 多态下不能使用子类的独立功能。
3、多态下的类型转换
上面提到在多态下不能使用子类的独立功能,那么怎么解决这个问题呢?使用多态的强制类型转换。
Animal 类
public class Animal {String name = "动物";public void run(){System.out.println("动物会跑~~~");}
}
Tortoise 类
public class Tortoise extends Animal {String name = "乌龟";@Overridepublic void run(){System.out.println("乌龟跑得慢");}
}
Wolf 类
public class Wolf extends Animal{String name = "狼";@Overridepublic void run(){System.out.println("狼跑的贼快~~~");}//这里是子类狼的独有功能public void eat(){System.out.println("狼吃羊~~~");}
}
Test类:测试类
public class Test {public static void main(String[] args) {//1、对象多态,行为多态Animal a1 = new Wolf(); //狼Animal a2 = new Tortoise();a1.run();//编译看左边,运行看右边。编译看Animal运行看 Wolfa2.run();//编译看左边,运行看右边System.out.println(a1.name);//成员变量,编译看左边,运行看左边System.out.println(a2.name);//成员变量,编译看左边,运行看左边print(a1);}public static void print(Animal a){ //这里形参传入方式是多太多的第二个好处。//如果在这里直接调用子类狼的独有的方法/行为//a.eat(); //报错//解决上面调用多态调用子类独立方法报错的问题://强制类型转换,但是要注意的是,强制类型转换可能会出错,如果把不是狼的对象转换成狼对象,就会出错//所以一般多态强制类型转换的时候会加关键字 "instanceof"做判断System.out.println("----开始------");if(a instanceof Wolf){Wolf w = (Wolf)a;w.eat();} else if (a instanceof Tortoise) {Tortoise t = (Tortoise)a;}}
}/*
输出结果:
狼跑的贼快~~~
乌龟跑得慢
动物
动物
----开始------
狼吃羊~~~*/
4、综合案例—支付模块


