JAVA多态
战神三考:Why、What、How
1、为何用多态?
2、多态是什么?
3、多态怎么用?
1、为什么要用多态
1)提高了代码的维护性 (通过继承和实现来保证)
2)提高了代码的扩展性 (通过多态来保证)
3)降低代码耦合度
2、多态基本概念
1.多态是继封装、继承之后,面向对象的第三大特性。
2.多态的理解:
现实事物经常会体现出多种形态,比如老虎,是一种猫科动物,蛇是一种冷血动物,
但老虎和蛇都是属于动物,也分别属于自己动物类别,当然猫科动物属类中还有很
多种,即动物在这里表现出了多种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。
如Snake类继承了Animal类,一个Snake的对象便既是Snake,又是Animal。
3.多态体现为父类引用变量可以指向具体的子类对象。
4.前提条件:必须有父子继承关系或者实现关系。
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
5.多态的定义与使用格式
定义格式:父类类型 变量名 = new 子类类型();
6.理解:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
3、多态怎么用
3.1、多态中的成员特点
// 上代码
public class Animal {
public String name = "animal";
@Override
public void eat(){
System.out.println("动物吃东西!");
}
}
public class Tiger extends Animal {
public String name = "tiger";
@Override
public void eat() {
System.out.println("虎吃鸡!");
}
public void run() {
System.out.println("虎奔跑!");
}
}
public class Snake extends Animal {
public String name = "snake";
@Override
public void eat() {
System.out.println("蛇吞象!");
}
public void run() {
System.out.println("蛇爬行!");
}
}
1.多态成员变量:编译检查的时候检查Animal类中是否有此变量定义
Animal tiger = new Tiger();
System.out.println("name = " + tiger.name); // name 是Animal中的值,编译期只能取到父中的值
上述打印输出结果为: name = Animal
2.使用多态调用成员方法:编译时检查左边类型,运行时实际调用右边对象
Animal snake = new Snake();
System.out.println(sanke.eat()); // snake 的门面类型是 Animal,
但实际类型是Snake, 所以运行时调用的是Snake中重写后的方法。打印输出结果为: 蛇吞象!
3.2、多态的转型和instanceof关键字
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
Amimal tiger = new Tiger();
tiger.run(); // 这样写会报错,因为编译检查tiger是Animal类型,Animal中没有run方法。
((Snake)tiger).run(); // 此时编译检查能通过,但是运行时会报错,因为tiger实际类型是Tiger类型,
此时强制类型转换成Snake,编译时检测tiger是Animal类型,Snake也是Animal的子类,所以
编译时无法发现老虎不能转化为蛇类型。
if (tiger instanceof Tiger) {
((Tiger) tiger).run() // 此时经过instanceof判断后才能进行强制类型转换,编译和运行时均能通过。
}
作用:用来判断某个对象是否属于某种数据类型。
3.3、多态案例
// 上代码
public class Keeper {
public void feed(Animal animal){
animal.eat();
}
}
public class Test {
public static void main(String[] args) {
Keeper GodXiu = new Keeper();
Animal snake = new Snake();
Animal tiger = new Tiger();
GodXiu.feed(snake);
GodXiu.feed(tiger);
}
}
上述案例中输出打印结果:
蛇吞象!
虎吃鸡!
4、个人思考总结
目前在日常开发中经常使用多态的地方就是使用集合的时候:
List list = new ArrayList();
Map map = new HashMap();
今天的个人理解和分享就到这了,后续有新的感悟会继续补充更新!