Java多态
一.多态概念
注:Python支持多态(同样还有鸭子类型【可以不必继承重写方法,只要方法名相同,动态语言的特性】)
意味着允许不同类的对象对同一信息做出不同的反应。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。分类:
编译时多态:设计时多态,方法重载
运行时多态:程序运行时动态决定调用哪个方法
Java多态必要条件:
满足继承关系;
父类引用指向子类对象
二.向上转型和向下转型
1.向上转型(隐式转型/自动转型):
父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法【小类转型为大类】
注意:父类中的静态方法无法被子类重写,所以向上转型之后,只有调用父类原有的静态方法(如果想调用子类的静态方法就得向下转型)
2.向下转型(强制类型转换):
子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法【 必须满足转换条件才能进行强制转换】

1 package com.swpu.test; 2 3 import com.swpu.plo.Animal; 4 import com.swpu.plo.Cat; 5 import com.swpu.plo.Dog; 6 7 public class Test { 8 9 public static void main(String[] args) { 10 /** 11 * 向上转型,隐式转型,自动转型 12 * 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法 13 * 【小类转型为大类】 14 */ 15 Animal one =new Animal(); 16 Animal two=new Cat(); 17 Animal three=new Dog(); 18 one.eat(); 19 //无法调用Cat和Dog独有的方法 20 two.eat(); 21 three.eat(); 22 /** 23 * 输出: 24 * 所有的动物都要吃东西 25 小猫吃东西!!! 26 狗吃东西!!! 27 28 */ 29 System.out.println("**************"); 30 31 /** 32 * 向下转型,强制类型转换 33 * 子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法 34 * 必须满足转换条件才能进行强制转换 35 */ 36 Cat tmp=(Cat)two; 37 tmp.eat(); 38 tmp.run(); 39 //会报错,Cat和Dog没有关系,能转换为Cat是因为two原来指向的就是Cat空间【相当于还原】 40 // Cat tmp2 =(Dog)two; 41 42 43 44 } 45 46 }View Code
3.instanceof:判断对象是否是某个类的实例
注:相当于Python中的isinstance方法(会检查继承链,肯定是所实例类的对象实例,也是其所继承类的实例),而Python中type只判断是否指向同一个对象(不会检查继承链)

1 if(two instanceof Cat){ 2 Cat tmp=(Cat)two; 3 tmp.eat(); 4 tmp.run(); 5 System.out.println("我是猫对象"); 6 } 7 8 if (two instanceof Dog){ 9 Dog tmp=(Dog)two; 10 tmp.eat(); 11 tmp.sleep(); 12 System.out.println("我是狗对象"); 13 } 14 if (two instanceof Animal){ 15 System.out.println("我是Animal对象"); 16 17 18 } 19 if (two instanceof Object){ 20 System.out.println("我是Object对象"); 21 22 } 23 /*输出: 24 * 小猫吃东西!!! 25 小猫跑步~~~ 26 我是猫对象 27 我是Animal对象 28 我是Object对象 29 30 */ 31 32View Code
4.类型转换总结:
注意:父类的静态方法不能在子类中被重写,可以同名(但是不构成重写,是子类特有的静态方法)

更多精彩