多态:JAVA中的多态即同种行为有多种不同表现形态。通俗一点来说就是使用同一个接口,使用不同的实例而执行不同的操纵。
多态意义何在:
- 消除类型之间的耦合关系
- 可扩充性
- 灵活性
- 接口性
通俗一点:既可以使用子类强大的功能,又可以抽取父类的共性。
多态存在的必要条件:
- 存在继承
- 存在重写
- 向上转型(父类引用指向子类对象)*重点理解,这是多态的关键
上代码:
package java_demo.多态;
public class Duot {
public static void main(String args[])
{
Animal a = new Dog(); //父类引用指向子类Dog对象
System.out.println(a.s); //父类引用调用自身属性
a.eat(); //子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法;
Dog c = (Dog)a;//向下转型,调用子类有而父类没有的方法
c.work();
Animal b = new Cat();
b.eat();
Cat d = (Cat) b;
d.work();
}
}
class Animal
{
public String s = "这是我的的秘密!";
public void eat()
{
System.out.print("我是动物,我吃饭!");
}
}
class Dog extends Animal //子类Dog
{
public void eat()
{
System.out.println("我是狗,我吃狗头!");
}
public void work()
{
System.out.println("我是狗,我会守家!");
}
}
class Cat extends Animal //子类Cat
{
public void eat()
{
System.out.println("我是猫,我吃鱼!");
}
public void work()
{
System.out.println("我是狗,我会抓老鼠!");
}
}
结果:
分析:
- 父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;
- 父类引用需要调用子类有而父类没有的方法时,需要向下转型。不然编译会出错。
- 可以说向上转型或者是多态都是通过动态绑定来实现的,如果对多态不理解的可以查看我的另外一篇文章(动态绑定)
我一直认为有的知识点说得太高深反而不容易理解,所以我写的每一篇博客都是以一种很通俗的讲法去让大家能够理解,有什么不懂得地方或者在Java或者Python上遇到不懂得地方都可以直接私信我来和大家一起共同解决。