多态
多态:
字面上的理解,多种形态有多种形式:方法的重写、方法的重载
对象也存在多种形式
多态语法
父类类名 对象名 = new 子类类名()
Animal cart =new Cart();
这种写法叫做父类指向子类对象
多态前提:类之间要有继承关系
多态的特征:
在多态情况下:
子父类中都有同名的静态方法是,调用同名静态方法应该注意:
编译看左边,运行看右边
子父类中都有同名的非静态方法时,调用同名非静态方法是应注意:
编译看左边,运行看右边
子父类中都有同名属性(静态和非静态)时,调用同名属性(静态和非静态)应该注意:
编译看左边,运行看左边
变量是不存覆盖的,只有方法才能覆盖
好处:提高代码的重用性,便于维护
多态的缺点
多态后不能调用子类特有的(只有子类中有,父类中没有的方法)方法
解决办法
向上转型(上塑造型):
子类猫转成了父类型(动物)
Animal an=new Cat();
向下转型(下塑造型):
父类型(动物)转成了子类型(猫)
Animal an=new Cat();
Cat c=(Cat)an;
向下转型注意:Animal an=new Cat();
Dog dog=(Dog)an;错误的
Animal an =new Animal();
Dog dog=(Dog)an;错误的
如:猫是动物的一种,但是动物不单单是猫
会报类型转换异常:java.lang.ClassCastException
多肽类型的判断instanceof
instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例
语法:对象 instanceof 类 返回值 boolean
public static void method(Animal an){
Animal an=new Cat();
Animal an=new Dog();
if(an instanceof Cat){
Cat cat=(Cat)an;
cat.catchMouse();//特有方法,只属于猫
}
if(an instanceof Dog){
Dog dog=(Dog)an;
dog.LookHome();//特有方法,只属于狗
}
an.eat();//不是特有方法
}