`
wezly
  • 浏览: 471747 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java可变参数方法重载的错误3例

阅读更多

JDK1.5引进了方法的可变参数,受到许多开发人员的青睐。有了这种机制,我们可以写出类似于JavaScript的arguments那样的带任意多个参数的方法。Java的可变参数,可用于普通方法上,也可以用于构造方法上,大大增大了我们所写方法的适用范围。 

然而,使用可变参数时,要注意几个问题: 

1) 可变参数方法与数组参数方法重载时

Java代码 
  1. public class MethodParams{  
  2. //带可变参数的方法  
  3. public void hello(String ...params) {  
  4. System.out.println("执行带可变参数的方法,参数个数为:" + params.length);  
  5. }  
  6. //带数组参数的方法  
  7. public void hello(String[] params) {  
  8. System.out.println("执行带数组参数的方法,数组长度为:" + params.length);  
  9. }  
  10. }  
  11. 我们写个测试代码运行一下看看结果如何:  
  12.   
  13. MethodParams mp = new MethodParams();  
  14. mp.hello("AAA","BBB","CCC");  
  15.   编译时报错:  
  16.   
  17. MethodParams.java:7: 无法在 MethodParams 中同时声明 hello(java.lang.String[]) 和  
  18. hello(java.lang.String...)  
  19. public void hello(String[] params) {  
  20. ^   

 

1 错误 
结论: JDK不允许存在, 带可变参数的方法和带数组参数的方法在同一类中重载。 

可变参数==数组参数? 在带可变参数的方法体时,读取可变参数列表时,就是以数组的方式来读取; 

带可变参数的方法可以传入一个数组参数,但带数组参数的方法却不能传入可变参数。 

2) 可变参数方法与可变参数方法重载时

Java代码 
  1. //带可变参数的方法  
  2. public void hello(String ...params) {  
  3. System.out.println("执行带可变参数的方法,参数个数为:" + params.length);  
  4. }  
  5. //带固定参数和可变参数  
  6. public void hello(String param1, String ...params) {  
  7. System.out.println("执行带固定参数和可变参数的方法,参数个数为:" + params.length);  
  8. }  
  9.   测试代码跟上例中一样,编译时报错:  
  10.   
  11. MethodParams.java:18: 对 hello 的引用不明确,MethodParams 中的 方法 hello(java.l  
  12. ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String  
  13. ...) 都匹配  
  14. mp.hello("AAA","BBB","CCC");  
  15. ^   

 

1 错误 
结论:JDK不允许存在,带相同参数类型列表(Type List)的参数列表的方法在同一类中重载。 

3)可变参数方法与无参数方法重载时

Java代码 
  1. //带可变参数的方法  
  2. public void hello(String ...params) {  
  3. System.out.println("执行带可变参数的方法,参数个数为:" + params.length);  
  4. }  
  5. //不带参数的方法  
  6. public void hello() {  
  7. System.out.println("执行不带参数的方法");  
  8. }   

 

我们都知道,可变参数即可带0个或者多个参数,如果带0个参数即不带参数时,JDK会怎么处理呢? 

那我们就以执行"mp.hello()"来测试一下。编译通过,运行正常,调用的还带参数的hello()方法。 

结论:当可变参数方法与不带参数的方法重载时,JDK默认调用的是无参数的方法。若类中没有定义无参数的方法,则会调用可变参数的方法。

分享到:
评论

相关推荐

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    Thinking in java4(中文高清版)-java的'圣经'

    非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    3. 方法需要的任意参数。 2.2.4 类 类是一个蓝图或样板,定义了某种类型的所有对象的变量和方法。 在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java 面试题 总结

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    疯狂JAVA讲义

    5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...

    超级有影响力霸气的Java面试题大全文档

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    扩展:Java高级技术.pdf

    类型后面三个点(String...),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列 表,其语法就是类型后跟...,表示此处接受的参数为0到多个Object类型的对象,或者是一个Object[]。 例如:有一个...

    AIC的Java课程1-6章

    AIC的学费很贵,半年18000元,大家看看他们教些什么内容吧 <br>他们学校的网址http://www.aicsws-sjtu.com/<br><br>此内容是Java第1到第六章的PPT,希望大家喜欢 <br>如果大家觉得好我...[参考,可变] <br>

    java面试题

    答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句的一部分,表示总是执行。 finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此...

    java范例开发大全源代码

     实例174 使用构造方法的重载计算课程的GPA值 287  第10章 内部类与接口(教学视频:41分钟) 290  10.1 成员内部类 290  实例175 成员内部类的使用规范 290  实例176 猜谜 292  10.2 方法内部类 ...

    java范例开发大全

    实例174 使用构造方法的重载计算课程的GPA值 287 第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 实例175 成员内部类的使用规范 290 实例176 猜谜 292 10.2 方法内部类 294 实例177 局部内部类的...

    Java范例开发大全 (源程序)

     实例174 使用构造方法的重载计算课程的GPA值 287  第10章 内部类与接口(教学视频:41分钟) 290  10.1 成员内部类 290  实例175 成员内部类的使用规范 290  实例176 猜谜 292  10.2 方法内部类 294  ...

    Java的六大问题你都懂了吗

    这些问题对于认真学习java的人都要必知的,...所以Java标准类库还提供了一个可变版本,即StringBuffer.  最后呢,还有些java的技术,包括EJB3.0等,可以选择学习,与三大轻量级框架相比,EJB就是当之无愧的重量级了。

    Java范例开发大全(全书源程序)

    实例174 使用构造方法的重载计算课程的GPA值 287 第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 实例175 成员内部类的使用规范 290 实例176 猜谜 292 10.2 方法内部类 294 实例177 局部...

Global site tag (gtag.js) - Google Analytics