目录
什么是多态
多态可以理解为多种形态,同一件事情,不同的对象去完成时会产生出不同的状态,也就产生不同的结果
重载和重写
重写
重写(override):子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写
重写可以让子类定义自己的行为,也可以用于实现父类的方法
-》重写的规则:
1、重写的方法的方法名相同,传入参数均相同
2、被重写的方法返回值类型可以不同,但是必须是具有父子关系
3、访问权限不能比父类中被重写的方法的访问权限更低。比如父类方法被public修饰,则子类中重写该方法就不能声明为 protected
4、父类被static、private修饰的方法、构造方法都不能被重写
重载
重载发生在一个类中
重载的特性:方法名相同,返回类型相同,传入方法的参数不同(包括个数和类型)
多态的分类
多态一般分为两种:重写式多态和重载式多态
重载式多态,也叫编译时多态
这种多态在编译时已经确定,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数而得到不同的结果。
重写式多态,也叫运行时多态
这种多态通过动态绑定技术来实现,在程序运行期间判断所引用对象的实际类型,根据实际的类型调用其相应的方法。也就是程序运行起来才知道调用的是哪个子类的方法
多态的条件
Java实现多态有三个必要条件:继承、重写、父类引用指向子类对象
继承: 存在继承体系下,涉及到父类和子类
重写:子类必须要对父类方法进行重写
父类引用指向子类对象:通过父类的引用调用子类中的重写方法
向上转型&向下转型
向上转型:
创建一个子类对象,将其当成父类对象来使用
父类类型 对象名 = new 子类类型()
多态本身是子类向父类向上转换(自动转换)的过程,这个过程是默许,无需强制转换
例如:animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
Animal animal1=new Dog();
//Animal是引用类型,new Dog()一个实例对象,即左侧的引用指向了子类的对象
//相当于Animal animal1=(Animal)new Dog();
缺点:将一个子类对象经过向上转型之后当成父类方法使用,就无法再调用子类特有的方法
向下转型:
向下转型是父类向子类转换的过程,这个过程需要强制转换
子类类型 子类变量名 = (子类类型) 父类变量名
父类可能存在多个子类,要转换成子类,就需要指定具体要变成哪个子类,必须有指向性,因此向下转型需要强制转换(指定子类类型)
Animal animal1=new Animal (); //创建一个父类对象
Dog dog1 = (Dog) animal1; //将父类对象强制转换成子类类型
//此时父类对象可以调用子类特有的方法
注:向下转型的缺陷:
假设Animal有两个子类Cat类和Dog类
向上转型的过程:Animal animal= new Cat(); //将父类引用指向了Cat子类实例
向下转型的过程: Dog dog1 = (Dog) animal; //此操作将父类对象animal强制转换为Dog类型
调用Dog类特有方法:dog1.walk() //此步会出现编译报错,报异常ClassCastException,Cat对象最后却变成Dog对象,这肯定是不正确的
可以使用instanceof来解决此问题,用于判断变量是否属于该数据类型或者其子类型
if ( animal instanceof Cat){
Cat cat = (Cat) animal;
cat.sleep();
}else if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.walk();
}