Java中的多态
1.认识多态
2.如何写一个多态
3.重写 vs 重载
4.向上转型的三种方法
5.多态的注意事项
1.认识多态
上一篇我们学习和认识了继承,今天我们将要认识多态,多态是基于继承来的,所以我们要学好多态,就需要将继承学习好。
多态就是多种形态,具体点就是去完成某个⾏为,当不同的对象去完成时会产⽣ 出不同的状态
比如说我们现在有一个父类,和俩个子类,我们通过父类引用,引用子类的对象,我们通过调用同一个方法,当子类不同时,调用方法的结果也会不同,这就是多态
2.如何写一个多态
我们现在有一个父类Animal 和 俩个子类分别是Cat和Dog,他们都有各自相同的方法 -- eat
当我们用父类引用,引用子类的对象时,在编译的时候,编译器会根据子类调用子类的方法
因为子类的方法和父类的方法相同 --- 此时就构成了重写
多态的实现条件:
1.必须在继承的关系下
2.子类必须重写父类的方法
3.通过父类引用调用子类重写的方法
3.重写 vs 重载
重载(静态绑定):
1.方法名相同
2.返回值不做要求
3.参数列表不同(数据类型, 顺序, 参数个数)
重写(动态绑定):
1.方法名相同
2.返回值相同(如果在继承关系下,返回值可以是各自的类名)
3.参数列表相同
我认为重写的本质:父类已经为你提供好了一个方法,当这个方法的格式或其他原因无法满足你的要求的时候,你重写在子类中重写一个方法名相同,返回值相同,参数列表相同的一个方法,此时通过父类引用调用子类的重写方法,当编译器编译的时候,会进行动态绑定,当发现有俩个相同的方法,并且存在继承关系,就会实现多态
4.向上转型的三种方法
向上转型:实际就是创建⼀个⼦类对象,将其当成⽗类对象来使⽤
也就是说父类引用,引用子类的对象
1.直接复制
我们可以直接用父类引用,引用子类的对象,并且进行初始化构造,当调用的对象不同时,同一个方法的结果也会不同
2.参数传递
我们可以写一个func方法,参数是父类引用,我们将子类对象传递给父类引用,这样父类就可以引用到子类对象,通过编译时动态绑定,就可以实现调用同一个方法,只要对象不同,调用的结果也会不同
3.返回值传递
同样的,我们可以写一个func方法,当我们传递某一个值,对特定某一个子类对象实例化,然后返回该对象,父类引用指向返回的对象,这样也可以实现调用同一个方法,对象不同时,调用同一个方法的结果不同
5.多态的注意事项
1.子类和父类只要存在继承关系,那么他们重写的方法的返回值可以不同
这种成为协变类型
2.子类的权限必须 >= 父类的权限
3.父类的权限不能为private
4.父类的方法不能被static修饰
5.父类的方法不能被final修饰
多态可以减少代码的冗余和复杂度,让我们的代码看起来更简洁轻松
比如我们要画一个形状,我们要画一头熊,圆, 一头熊,一个立方体,一头熊
如果我们不使用多态来帮助我们的话,我们就需要使用数组存放每一个要画的图形的字符串,然后通过if判断我们要画的形状,如果要画的数量非常多,种类也非常多,那么我们代码就看起来很复杂,很冗余,可读性就比较差
那么我们使用多态就可以非常简化我们的代码,我们可以用父类来定义一个数组,里面存放着我们要调用到的不同对象,通过for-each进行向上转型,就可以实现同一个方法,当对象不同的时候,调用到的结果也不同
我们使用了向上转型,动态绑定,重写,多态,让我们的代码简洁,可读性改善了许多