一.多态,从字面理解上是多种形态,具体来说就是当不同对象去实现某个相同的动作时,会产生不同的结果或状态!!!
如何理解上述语句呢,例如,动物都需要吃饭,而猫吃饭可能吃的是猫粮,狗吃饭吃的可能是狗粮,同样是吃饭,在不同对象上产生了不同的形态,
二.多态的实现条件
1.必须在继承体系下
2.子类必须要对父类中方法进行重写
3.通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
public class Animal { String name;
int age;
public Animal(String name, int age){ this.name = name;
this.age = age;
}
public void eat(){ System.out.println(name + "吃饭");
}
}
public class Cat extends Animal{ public Cat(String name, int age){
super(name, age);
}
@Override public void eat(){
System.out.println(name+"吃鱼~~~");
}
}
public class Dog extends Animal { public Dog(String name, int age){
super(name, age);
}
@Override public void eat(){
System.out.println(name+"吃骨头~~~");
}
}
public class TestAnimal {
// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以
public static void eat(Animal a){
a.eat();
}
public static void main(String[] args) {
Cat cat = new Cat("元宝",2);
Dog dog = new Dog("小七", 1);
eat(cat);
eat(dog);
}
}
上述代码的运行结果为
运行结果:
元宝吃鱼~~~
小七吃骨头~~~
从这段代码可以看出,1.猫狗都是动物的子类 2.且猫和狗两种子类都对eat方法进行重写 3.猫和狗两种类都通过父类引用调用了已经重写的eat方法
当类的调用者在编写 这个方法的时候, 参数类型为 Animal (父类), 此时在该方法内部并不知道, 也不关注当前的a 引用指向的是哪个类型(哪个子类)的实例. 此时 a这个引用调用 eat方法可能会有多种不同的表现(和 a 引用的实例相关), 这种行为就称为 多态.
三.总结:
多态的优点:1.提高代码的复用率,避免过多判断对象以致于出现太多if else语句,降低圈复杂度,简化代码。 2.可扩展能力更强如果要新增一种新的形态, 使用多态的方式代码改动成本也比较低.多态的缺点:代码的运算效率降低,
提醒:
1.属性没有多态性
2.避免在构造方法中调用重写的代码(构造方法没有多态性),用尽量简单的方式使对象进入可工作状态", 尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题.
四.最后:
多态是一种思想与手段,是继承与重写组合起来可以实现的东西,合理利用多态,避免多态的缺点,可以使自己的代码更上一层楼