`
wezly
  • 浏览: 484304 次
  • 性别: 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中的可变参数使用方法

    例如,如果95%的调用都只需要3个或更少的参数,可以声明四个分别接受0到3个参数的重载方法,只有当参数数量超过3个时,才使用可变参数方法。这样可以在大多数情况下避免额外的数组创建。 5. 示例: ```java ...

    Java方法的可变参数类型实例分析

    Java中的可变参数类型是一种非常实用的特性,它允许我们在定义方法时接受任意数量的同类型参数。这个特性从Java 5开始引入,极大地增强了代码的灵活性和可读性。可变参数通常以"..."(三个点)的形式出现在参数列表...

    浅谈Java中的可变参数

    Java中的可变参数(Variable-Argument Parameters)是一个强大的特性,它允许我们在方法声明中使用一个可变数量的参数。这个特性使得我们无需为每个参数数量创建不同的方法重载,简化了代码并提高了可读性。下面我们...

    浅谈Java中方法的参数传值.zip

    在Java编程语言中,方法是实现特定功能的代码块,它们可以接受输入(参数)并返回结果。本文将深入探讨Java中方法参数的传递机制,帮助开发者更好地理解这一核心概念。 1. 参数传递方式 Java中,方法参数的传递主要...

    Java重载.docx

    文件代码: ```java ...总之,Java中的方法重写是实现多态性的重要手段,它允许子类根据需要定制父类的方法,增强了代码的灵活性和可扩展性。理解并正确应用这些重写规则是Java编程中的关键技能。

    java学习中的错误查找

    11. **方法重载与覆盖**:理解方法的重载和覆盖的区别,重载是同一个类中方法名相同但参数列表不同的方法,而覆盖发生在子类中,用于改变父类的方法实现。 12. **包和导入**:合理组织代码到不同的包中,正确导入所...

    Java的继承、重载和多态.doc

    3. **重载**:重载(Overloading)指的是在同一个类中,可以有多个方法拥有相同的名称但参数列表不同(参数个数、类型或者顺序不同)。如`Computer`类中的两个`compute`方法,它们的参数类型不同,这就是方法的重载...

    500强经典java笔试

    - A: Java中的方法重载只看参数列表 - B: Java中的方法重载考虑返回类型 - C: Java中的方法重载允许同名方法有不同的实现 - D: Java中的方法重载与方法签名有关 **答案:** ACD **解析:** - A: 正确,方法重载只看...

    10个Java经典的Main方法面试题!

    5. **main 方法的重载**:在 Java 中,`main` 方法可以被重载,即同一个类中可以有多个 `main` 方法,但请注意,程序启动时只会执行具有特定签名(`public static void main(String[] args)`)的那个。 6. **main ...

    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 小结:多方位理解...

    Java程序设计试卷与答案

    3. 方法重载:在同一类中,方法的重载意味着可以有多个同名方法,但它们的参数列表必须不同,可以是参数个数、参数类型或参数顺序不同,而返回类型不是决定重载的关键因素。 4. Java垃圾回收:Java有自动垃圾回收...

    java复习试题

    14. Java编译器可以根据参数类型和数量正确识别重载方法,(B)错误。 15. 接口使用interface关键字定义,(B)错误。 16. 接口中只包含方法签名,不包含具体实现,(A)正确。 17. 一个类可以同时继承一个父类并...

    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 小结:多方位理解...

    Scala中使用JSON.toJSONString报错原因分析-解决方案.docx

    Scala 中使用 JSON.toJSONString 报错原因分析-解决方案 在 Scala 中使用 JSON.toJSONString ...同时,在 Java 中,使用可变长参数的方法重载可以提高方法的灵活度和可复用性,但是也需要注意方法的调用变得“模糊”。

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

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

    Java重载构造原理与用法详解

    Java重载构造原理与用法详解是Java编程语言中的一种重要概念,它涉及到方法重载、构造器、可变参数、递归算法、封装等多个方面的知识点。下面将对这些知识点进行详细的解释和分析。 一、可变参数 可变参数是Java...

    04JVM是如何执行方法调用的?(上)1

    在实际开发中,我们需要注意可变长参数方法的重载,因为它可能会引起Java编译器无法决定应该调用哪个目标方法,从而导致编译错误。同时,我们也需要注意重载和重写的使用场景,以免引起编译错误或逻辑错误。 理解...

    网友精选25个Java试题分享

    5. **final与finally**:`final`是修饰符,用于声明不可变的类、方法或变量。`finally`在异常处理中用于确保某些代码无论如何都会执行,即使在try-catch块中有return、break或continue语句。 6. **数据类型转换**:...

    java期末考试试题含复习资料.pdf

    15. Java 中的 StringBuffer:Java 中的 StringBuffer 是一个可变字符串类,提供了多种方法来操作字符串。StringBuffer 的构造方法包括 StringBuffer()、StringBuffer(int capacity) 和 StringBuffer(String str) 等...

Global site tag (gtag.js) - Google Analytics