赞
踩
本文内容摘自《深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)》一书,2022年出版,作者 张洪亮(@Hollis),阿里巴巴技术专家,著有《Java工程师成神之路》系列文章,《Java工程师成神之路》电子书已开源,可在阿里云开发者社区免费下载。书籍内容比电子书内容要丰富,内容有修改,有需要的读者可以购买正版书籍。
【如何成神:先搬砖,再砌砖,后造砖!】
本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错,请点点赞,加关注,谢谢!
《Java工程师成神之路》下载地址为:
https://developer.aliyun.com/ebook/395?spm=a2c6h.20345107.ebook-index.24.4c927863j10ats
多态(Polymorphism)
:指为不同数据类型的实体提供统一的接口,或者使用一个单一的符号来表示多种不同的类型。多态有以下几类。
1、特设多态:程序设计语言中的一种多态,多态函数有多个不同的实现,依赖于其实参而调用相应版本的函数。应用场景:函数重载、运算符重载。
2、参数多态:在程序设计语言与类型论中,参数多态是指声明与定义函数、复合类型、变量时不指定其具体的类型,而把这部分类型作为参数使用,使得该定义对各种具体类型都适用。应用场景:泛型、函数式编程。
3、子类型多态:在面向对象程序设计中,当计算机程序运行时,相同的消息可能会发送给多个不同类别的对象,而系统依据对象的所属类别,触发对应类别的方法,产生不同的行为。应用场景:Java中常见的多态。
【Java中的多态(动态多态)】
Java中多态的概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
Java中的多态其实是一种运行期的状态,需要满足三个条件:
【多态例子(书中例子,有改动)】
核心代码:
/**
* 父母类
*/
public class Parent {
public void call() {
System.out.println("我是父母");
}
}
/**
* 儿子类
*/
public class Son extends Parent {
/**
* 儿子类要重写父母类的方法
*/
@Override
public void call() {
System.out.println("我是儿子");
}
}
/**
* 女儿类
*/
public class Daughter extends Parent {
/**
* 女儿类要重写父母类的方法
*/
@Override
public void call() {
System.out.println("我是女儿");
}
}
主函数:
public class PolymorphismApp {
public static void main(String[] args) {
Parent p1 = new Son();
System.out.println("**********我是分割线1**********");
p1.call();
Parent p2 = new Daughter();
System.out.println("**********我是分割线2**********");
p2.call();
}
}
运行结果:
D:\Develop\JDK\jdk1.8.0_281\bin\java.exe
**********我是分割线1**********
我是儿子
**********我是分割线2**********
我是女儿
Process finished with exit code 0
同样是Parent类的实例,p1.call() 调用的是Son类的实现,p2.call()调用的是Daughter类的实现。
有人说,你自己定义时不就已经知道p1是Son,p2是Daughter了吗?但是,有时候用到的对象并不都是自己声明的,比如Spring中基于IoC创建的对象,在使用时就不知道这个对象是谁,或者说你可以不用关心这个对象是谁,而是根据具体情况而定。
IoC是 Inversion of Control 的缩写,即控制反转,它是一种设计思想,意味着将设计好的对象交给容器控制,而不是在对象内部直接控制。
换句话说,当我们使用Spring框架时,对象是Spring容器创建出来并由容器进行管理的,只需要使用就行了。
【静态多态】
前面的动态绑定被认为是动态多态,因为只有在运行期才知道真正调用的是哪个类的方法。还有静态多态,一般认为函数重载是静态多态,因为需要在编译期决定具体调用哪个方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。