多态的作用就是来消除类型之间的耦合的。多态方法调用允许一种类型表现
出与其他相似类型之间的区别,只要它们都是从同一基类导出的。
举个有关乐器的例子,如果按照以前的风格编写,就会呈现下面这种情况:
public class music {
public static void tune(Stringed s){
s.play(Note.B_FLAT);
}
public static void tune(Brass b){
b.play(Note.C_SHARP);
}
public static void main(String[] args) {
Stringed stringed = new Stringed();
Brass brass = new Brass();
tune(stringed);
tune(brass);
}
}
enum Note{
MIDDLE_C,C_SHARP,B_FLAT;
}
class instrument{
public void play(Note n){
System.out.println("instrument.play()");
}
}
class Stringed extends instrument{
@Override
public void play(Note n) {
System.out.println("Stringed.play()"+n);
}
}
class Brass extends instrument{
@Override
public void play(Note n) {
System.out.println("Brass.play()"+n);
}
}
按照这个方法写的话,就会存在很多弊端,如果随着跟多乐器的加入,tune()就会越来越多,非常不利于管理,此外,如果我们忘记重载某个方法,编译器不会返回任何错误信息,这样关于类型的整个处理过程就会变得难以操作。
什么是多态?通俗易懂的说,就是对于同一行为,不同的子类对象有不同的表现形式
多态存在的3个条件1、继承
2、重写
3、父类引用指向子类对象
举个简单的例子:
在玩英雄联盟的时候,当我们按下q
对于亚索,就是斩钢闪对于提莫,就是致盲吹箭对于剑圣,就是阿尔法突袭
同一个事件发生在不同的对象上就会产生不同的结果
那么我们就可以将上面的例子进行优化:
package com.piao.test;
public class music {
public static void tune(instrument i,Note n){
i.play(n);
}
public static void main(String[] args) {
Stringed stringed = new Stringed();
Brass brass = new Brass();
tune(stringed,Note.C_SHARP);
tune(brass,Note.B_FLAT);
}
}
enum Note{
MIDDLE_C,C_SHARP,B_FLAT;
}
class instrument{
public void play(Note n){
System.out.println("instrument.play()");
}
}
class Stringed extends instrument{
@Override
public void play(Note n) {
System.out.println("Stringed.play()"+n);
}
}
class Brass extends instrument{
@Override
public void play(Note n) {
System.out.println("Brass.play()"+n);
}
}



