前天在逛知乎的时候看到一个很直观地去理解JAVA多态的例子,很简单生动,真的挺有趣,所以我把原答案PO上来分享给大家。
以下是原文的内容:
不请自来,C++的多态不太清楚。java比较熟悉,就说说咯。
用一句话概括就是:事物在运行过程中存在不同的状态。
多态的存在有三个前提:
要有继承关系;
子类要重写父类的方法;
父类引用指向子类对。
但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。
父类Animal
子类Cat
测试类Demo_Test1
以上的三段代码充分体现了多态的三个前提,即:
存在继承关系:Cat类继承了Animal类;
子类要重写父类的方法:子类overwrite了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static);
父类数据类型的引用指向子类对象。
测试类Demo_Test1中Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
到此,满足了Java多态的必要三个前提。
输出结果
可以看出来
子类Cat重写了父类Animal的非静态成员方法am.eat()的输出结果为:猫吃饭。
子类重写了父类的静态成员方法am.sleep()的输出结果为:动物在睡觉。(说明没重写成功)
未被重写的am.run()的输出结果为:动物在奔跑。
那么我们可以根据以上情况总结出多态成员访问的特点:
成员变量
编译看父类,运行看父类;
成员方法
编译看父类,运行看子类,动态绑定;
静态方法
编译看父类,运行看父类。
多态的弊端在于子类不能使用自己特有的属性和方法。例如猫有抓老鼠这个方法。但是子类Cat重写了父类Animal的方法,就无法使用猫抓老鼠的方法,当尝试使用时会报错。
原问题地址:https://www.zhihu.com/question/30082151/answer/120520568注:加群要求 学习交流群:642830685
1、想学习JAVA这一门技术, 对JAVA感兴趣零基础,想从事JAVA工作的。
2、工作1-5年,感觉自己技术不行,想提升的
2、工作1-5年,感觉自己技术不行,想提升的
3、如果没有工作经验,但基础非常扎实,想提升自己技术的。
4、还有就是想一起交流学习的。
5.小号加群一律不给过,谢谢。
转发此文章请带上原文链接,否则将追究法律责任