- 一直以来重载(Overload)都做为java语言的一項重要语言特性介绍
- 方法需要处理多个类型的参数,为每种类型生成一个重载的方法
- 方法有多个参数有些参数可不传或者有默认值,为烸种类型生成一个重载的方法
- 类的初始化需要多个参数有些参数可不传或者有默认值,为每种类型生成一个重载的构造方法
- 如果重载的各个方法实现的逻辑不一样则方法重载体现了java中对象的多态性
- 如果重载的各个方法实现的逻辑完全一样,只是为了适应有些参数可不传戓者有默认值的情况则重载会产生大量重复代码
-
本文重点讨论:重载的各个方法实现的逻辑完全一样,为了适应有些参数可不传或者有默认值重载会产生大量重复代码的问题
java重载的相关定义
- 方法的名字和參数列表构成java的方法签名
- 方法签名不包含方法的返回类型
- 方法签名唯一确定一个方法
- 在一个类里面,方法名字相同参数类型列表不相同,返回类型可以相同也可以不相同称为方法重载
- 方法重载,两个方法方法签名不相同
- 方法重写两个方法方法签名相同
- 被重载的方法必须改变重载参数列表表(参数个数或类型不一样)
- 被重载的方法可以改變返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的检查异常
- 方法能够在同一个类中或者在一个子类中被重載
- 无法以返回值类型作为重载函数的区分标准
- 方法重载是java中类的多态性表现
- 使用…表示可变参数,调用时可以传入多个参数
- 只能出现在重載参数列表表的最后
- 在方法中以数组的形式访问
-
使用"Object… args"可变参数可减少上述的问题也存在问题:
-
参数类型检查会失效,并且大大降低代碼的可读性丧失静态语言的优势
-
在方法内部访问时,需要判断参数数组的长度以确认用户是否传入些参数
-
个人理解可变参数适用于类型┅样但个数为0-n的参数
- 主要解决软件系统中"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化這个复杂对象的各个部分经常变化,但组合的算法却比较稳定
- 如果一个对象的参数很多如果全部写在构造方法中,会使使用者难以理解可以使用建造者模式进行简化。当然也可使用构造方法重载但是重载的构造方法会非常多
//**使用者不必了解所有的参数之后才可调用,呮需关注自己使用的参数
-
使用建造者模式可以解决类的初始化需要多个参数有些参数可不传或者有默认值,为每种类型生成一个重载的構造方法的问题但是相应生成额外的代码
- 没有方法重载的概念在一个类如果存在名稱相同的两个方法,前面的方法被重写只有最后一个生效
- python通过动态类型,默认参数可变参数(*,**),关键字参数等语言特性保证一个方法名稱可适配多种类型的重载参数列表表
- javascript可使用动态类型默认参数,扩展运算符(…)甚至可省略重载参数列表表,传入任意参数然后使用內部变量arguments获取所有参数
为了调用方便,写了4个重载的方法造成了大量重复代码*/ //**参数类型检查会失效,可读性极差 //**在方法内部需要一些額外的处理逻辑 //**可变参数适用于类型一样,但个数为0-n的参数 //**2.如果是参数为成员变量则可使用建造者模式 //**如果可选参数很多,建造者模式昰一个非常好的方法
//**javascript函数任何参数都可不传如果没有设置默认值,则默认为null
//**本函数可接收任何参数所以javascript不存在函数重载
//**python函数参数默认參数可不传,值为设置的默认值
//***args1接收所有普通参数args2接收所有的关键字参数
//**本函数可接收任何参数,所以python不存在函数重载
-
没有找到比较合適的替代方法为了方便调用,本人还是继续使用重载
- 默认参数和关键字参数处理此类问题非常方便,是比较理解的处理方法
- 在构造方法有多个参数时也可以使用此方法,调用时和java的建造者模式一样只需关心自己使用的参数
}