Java面向对象_多态性、instanceof关键字
一、多态
分类:方法的重载与重写;对象的多态性
对象的多态性:向上转型:将子类实例转为父类实例 格式:父类 父类对象=子类实例;是自动转换
向下转型:将父类实例转为子类实例 格式:子类 子类对象=(子类)父类实例;是强制转换
小结:方法的重载与重写就是方法多态性表现;多个子类就是父类中的多种形态;父类引用可以指向子类对象,自动转换;子类对象指向父类引用需要强制转换;在实际开发中尽量使用父类引用(更利于扩展)
父类设计法则:父类通常情况下都设计为抽象类或接口,其中优先考虑接口,如接口不能满足才考虑抽象类
一个具体的类尽可能不去继承另一个具体类,这样的好处是无需检查对象是否为父类的对象
二、instanceof关键字
通过这个关键字可以很方便的检查对象的类型,但如果一个父类的子类过多,这样判断就显得繁琐,所以产生了上面的父类设计法则。
通常在子类中存在父类中没有的方法,而要用父类引用调用时会用到这个关键字进行判断(一般不建议出现此类情况)
1 public class Practice14 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 //用父类的引用指向子类对象 6 Cat cat=new YeCat();//自动转换 7 8 //把父类引用转换为子类对象,有可能发生类型转换异常 9 //instanceof检查对象是否为某个类型 10 if(cat instanceof HomeCat){ 11 HomeCat h=(HomeCat)cat;}//强制转换 12 print(cat); 13 } 14 //体现多态,只有在真正使用时才知道是谁跑 15 public static void print(Cat c){ 16 c.run(); 17 } 18 } 19 //抽象类 20 abstract class Cat{ 21 public abstract void run(); 22 } 23 24 class HomeCat extends Cat{ 25 public void run(){ 26 System.out.println("跑的慢"); 27 } 28 } 29 30 class YeCat extends Cat{ 31 public void run(){ 32 System.out.println("跑的快"); 33 } 34 }