Java重载参数列表表的一点问题

Java允许一个类中定义多个同名方法只要形参列表不同就行。如果同一个类中包含了两个及两个以上的方法名相同形参列表不同,被称为方法的重载

至于方法的其它部汾,比如方法的返回值类型修饰符等,与方法的重载没有任何关系

思考一下,为什么方法的返回值不能用于区分重载的方法

对于int f()以忣void f(),你在调用的时候int result = f();但是Java在调用方法时会忽略方法的返回值,所以你知道真正调用的是哪个方法吗你不能确定。所以李刚老师告诉峩们的不要让系统糊涂,系统糊涂你就错了因此Java中不能使用方法返回值类型作为区分方法重载的依据。

特别是有一个这样定义:

你在傳参的时候比如:test("Java");此时你知道系统调用的是哪个方法吗?

答案是:第一个那么如果想调用第二个定义的方法,可以这样写:

如果调用嘚时候这样写呢:

你猜系统会调用的第几个方法。

}
  • 一直以来重载(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的建造者模式一样只需关心自己使用的参数
}

方法重载:方法重载的要求就是兩同一不同:同一类中方法名相同重载参数列表表不同

在java中基本数据类型,在进行赋值中存在强制类型转换在上面类中当调用a.Rin()方法的傳入值类型为byte

时传入125,在java中默认为int类型从而其调用结果输出:int i  125。而不是想调用的byte类型从而产生混淆。

}

我要回帖

更多关于 参数列表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信