这篇文章主要介绍了Java中多态是什么意思,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
多态
<强>在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。强>
多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。多态的作用就是消除类型之间的<代码>耦合关系> 代码。
1。向上转型
根据<代码>里氏代换原则> 代码:任何基类可以出现的地方,子类一定可以出现。
对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。而这种吧对某个对象的引用视为对其基类型的引用的做法被称作为——<代码>向上转型> 代码。因为父类在子类的上方,子类要引用父类,因此称为<代码>向上转型> 代码。
公共类动物{空吃(){ System.out.println(“动物吃()“); } }类猴子一直延伸到动物{太空吃(){ System.out.println (“;猴子吃()“); } }{公共静态类测试空白开始(动物动物){ animal.eat (); }公共静态void main (String [] args) { 猴子猴子猴子=new (); 开始(猴子); } }/*输出: 猴子吃() */复制代码
上述<代码> 代码>测试类中的<代码> start() 代码>方法接收一个<代码> 代码>,动物的引用,自然也可以接收从<代码>动物> 代码的导出类。调用<代码>吃()代码>方法的时候,自然而然的使用到猴子<代码> 代码>中定义的<代码>吃()代码>方法,而不需要做任何的类型转换。因为从<代码> 代码>向猴子上转型到<代码> 代码>只动物能减少接口,而不会比动物<代码> 代码>的接口更少。
打个不是特别恰当的比方:你父亲的财产会继承给你,而你的财产还是你的,总的来说,你的财产不会比你父亲的少。
忘记对象类型
在<代码> test.start() 代码>方法中,定义传入的是<代码>动物> 代码的引用,但是却传入<代码>猴子> 代码,这看起来似乎忘记了猴子<代码> 代码>的对象类型,那么为什么不直接把<代码> 代码>测试类中的方法定义为<代码>空白开始(猴子猴子)> 代码,这样看上去难道不会更直观吗。
直观也许是它的优点,但是就会带来其他问题:<代码> 代码>动物不止只有一个猴子<代码> 代码>的导出类,这个时候来了个<代码>猪> 代码,那么是不是就要再定义个方法为<代码>空白开始(猴子猴子)> 代码,重载用得挺溜嘛小伙子,但是未免太麻烦了。懒惰才是开发人员的天性。
因此这样就有了<代码>多态> 代码的产生
2。显露优势
<强>方法调用强>中分为<代码>静态绑定代码>和<代码>动态绑定> 代码。何为绑定:将一个方法调用同一个方法主体关联起来被称作绑定。
- <李> <代码>静态绑定> 代码:又称为<强>前期绑定>强。是在程序执行前进行把绑定。我们平时听到“静态“的时候,不难免想到<代码>静态代码>关键字,被静态代码> <代码>关键字修饰后的变量成为静态变量,这种变量就是在程序执行前初始化的。<代码>前期绑定> 代码是面向过程语言中默认的绑定方式,例如C语言只有一种方法调用,那就是前期绑定。李>
<强> 引出思考: 强>
公共静态空虚开始(动物动物){ animal.eat (); }复制代码
在start()
方法中传入的是Animal
的对象引用,如果有多个Animal
的导出类,那么执行eat()
方法的时候如何知道调用哪个方法。如果通过前期绑定
那么是无法实现的。因此就有了后期绑定
。
动态绑定
:又称为后期绑定
。是在程序运行时根据对象类型进行绑定的,因此又可以称为运行时绑定
。而 Java 就是根据它自己的后期绑定机制,以便在运行时能够判断对象的类型,从而调用正确的方法。
小结:
Java 中除了 static
和 final
修饰的方法之外,都是属于后期绑定
合理即正确
显然通过动态绑定
来实现多态
是合理的。这样子我们在开发接口的时候只需要传入 基类 的引用,从而这些代码对所有 基类 的 导出类 都可以正确的运行。
其中Monkey
、Pig
、