多态是Java面向对象的一个重要特征。多态就是不同的对象对同一个事物做出的不同反应。方法重写是实现多态的基础.
1.向上转型
父类引用指向子类
向上转型的语法:
<父类型> <引用变量名> =new <子类型>()
public class Animol {
public void eat(){
System.out.println("动物吃饭");
}
}
class Dog extends Animol{
public void eat() {
System.out.println("狗吃骨头");//重写父类的eat
}
public void what(){
System.out.println("守护院子");//狗独有的方法
}
}
class Cat extends Animol{
public void eat(){
System.out.println("猫吃鱼");//重写父类的eat
}
public void shou(){
System.out.println("猫捉老鼠");//猫独有的方法
}
}
Animol animol=new Cat();(这里就是向上转型) animol.eat(); Animol animol1=new Dog();(这里就是向上转型) animol1.eat();
结果是调用了子类的重写的eat
猫吃鱼
狗吃骨头
我们发现无法调用子类独有的发法
子类转换为父类时的规则:
1.将一个父类的引用指向子类对象称为向转型,系统自动类型转换
2.此时通过父类引用变量调用方法时,子类覆盖或继承了父类的方法,不是父类的方法
3.此时无法通过父类的引用变量调用子类特有的方法
3.向下转型
当向上转型发生后,将无法调用子类特有的方法,但是弱国需要调用子类特有的方法,可以通过把父类转换为子类的实现
将一个指向子类对象的父类引用给一个子类引用,即父类类型转换为子类类型,称为向下转型,此时必须要强制类型转换
向下类型转换的语法:
<子类型> <引用变量名> =(子类类型)<父类类型的引用变量>
这时我们可以用向下转型来调用子类独有的方法
Cat cat= (Cat) animol;(没有new) ((Cat) animol).shou();
这是结果时;猫捉老鼠
成功调用
这时我们试试Dog类
Dog dog= (Dog) animol;
我们发现没有提示报错但运行出错了
Exception in thread "main" java.lang.ClassCastException: paage1.Cat cannot be cast to paage1.Dog
at paage1.Test.main(Animol.java:40)
我们引入一个关键字
4.instanceof运算符
在向下转型的过程中,如果不是转换为真实的子类类型,会出现异常
简单来说此时的animol已经是cat类了
instanceof就可以帮助我来判段是否是真实的子类类型。使用instanceof 时,对象类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误
如下代码:
if (animol instanceof Cat){
((Cat) animol).shou();
}else if (animol instanceof Dog){
((Dog) animol).what();
}
结果是:猫捉老鼠
如果想调用Dog独有的方法需要:
Animol animol1=new Dog();
Dog dog= (Dog) animol1; ((Dog) animol1).what();
就是在new一个animal1
5.使用父类作为方法的形参
使用父类作为方法的参数,是java中实现和使用多态的主要方式
class Host{
public void Leteat(Animol animol){
animol.eat();
}
}
class Test2{
public static void main(String[] args) {
Host host=new Host();
Animol animol;
animol=new Dog();
host.Leteat(animol);
animol=new Cat();
host.Leteat(animol);
}
}
调用父类来控制子类
2.使用父类作为方法的返回值(了解即可)
使用父类作为方法的返回,也是java中实现和使用多态的主要方式