JDK1.5引进了方法的可变参数,受到许多开发人员的青睐。有了这种机制,我们可以写出类似于JavaScript的arguments那样的带任意多个参数的方法。Java的可变参数,可用于普通方法上,也可以用于构造方法上,大大增大了我们所写方法的适用范围。
然而,使用可变参数时,要注意几个问题:
1) 可变参数方法与数组参数方法重载时
- public class MethodParams{
-
- public void hello(String ...params) {
- System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
- }
-
- public void hello(String[] params) {
- System.out.println("执行带数组参数的方法,数组长度为:" + params.length);
- }
- }
- 我们写个测试代码运行一下看看结果如何:
-
- MethodParams mp = new MethodParams();
- mp.hello("AAA","BBB","CCC");
- 编译时报错:
-
- MethodParams.java:7: 无法在 MethodParams 中同时声明 hello(java.lang.String[]) 和
- hello(java.lang.String...)
- public void hello(String[] params) {
- ^
1 错误
结论: JDK不允许存在, 带可变参数的方法和带数组参数的方法在同一类中重载。
可变参数==数组参数? 在带可变参数的方法体时,读取可变参数列表时,就是以数组的方式来读取;
带可变参数的方法可以传入一个数组参数,但带数组参数的方法却不能传入可变参数。
2) 可变参数方法与可变参数方法重载时
-
- public void hello(String ...params) {
- System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
- }
-
- public void hello(String param1, String ...params) {
- System.out.println("执行带固定参数和可变参数的方法,参数个数为:" + params.length);
- }
- 测试代码跟上例中一样,编译时报错:
-
- MethodParams.java:18: 对 hello 的引用不明确,MethodParams 中的 方法 hello(java.l
- ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String
- ...) 都匹配
- mp.hello("AAA","BBB","CCC");
- ^
1 错误
结论:JDK不允许存在,带相同参数类型列表(Type List)的参数列表的方法在同一类中重载。
3)可变参数方法与无参数方法重载时
-
- public void hello(String ...params) {
- System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
- }
-
- public void hello() {
- System.out.println("执行不带参数的方法");
- }
我们都知道,可变参数即可带0个或者多个参数,如果带0个参数即不带参数时,JDK会怎么处理呢?
那我们就以执行"mp.hello()"来测试一下。编译通过,运行正常,调用的还带参数的hello()方法。
结论:当可变参数方法与不带参数的方法重载时,JDK默认调用的是无参数的方法。若类中没有定义无参数的方法,则会调用可变参数的方法。
分享到:
相关推荐
例如,如果95%的调用都只需要3个或更少的参数,可以声明四个分别接受0到3个参数的重载方法,只有当参数数量超过3个时,才使用可变参数方法。这样可以在大多数情况下避免额外的数组创建。 5. 示例: ```java ...
Java中的可变参数类型是一种非常实用的特性,它允许我们在定义方法时接受任意数量的同类型参数。这个特性从Java 5开始引入,极大地增强了代码的灵活性和可读性。可变参数通常以"..."(三个点)的形式出现在参数列表...
Java中的可变参数(Variable-Argument Parameters)是一个强大的特性,它允许我们在方法声明中使用一个可变数量的参数。这个特性使得我们无需为每个参数数量创建不同的方法重载,简化了代码并提高了可读性。下面我们...
在Java编程语言中,方法是实现特定功能的代码块,它们可以接受输入(参数)并返回结果。本文将深入探讨Java中方法参数的传递机制,帮助开发者更好地理解这一核心概念。 1. 参数传递方式 Java中,方法参数的传递主要...
文件代码: ```java ...总之,Java中的方法重写是实现多态性的重要手段,它允许子类根据需要定制父类的方法,增强了代码的灵活性和可扩展性。理解并正确应用这些重写规则是Java编程中的关键技能。
11. **方法重载与覆盖**:理解方法的重载和覆盖的区别,重载是同一个类中方法名相同但参数列表不同的方法,而覆盖发生在子类中,用于改变父类的方法实现。 12. **包和导入**:合理组织代码到不同的包中,正确导入所...
3. **重载**:重载(Overloading)指的是在同一个类中,可以有多个方法拥有相同的名称但参数列表不同(参数个数、类型或者顺序不同)。如`Computer`类中的两个`compute`方法,它们的参数类型不同,这就是方法的重载...
- A: Java中的方法重载只看参数列表 - B: Java中的方法重载考虑返回类型 - C: Java中的方法重载允许同名方法有不同的实现 - D: Java中的方法重载与方法签名有关 **答案:** ACD **解析:** - A: 正确,方法重载只看...
5. **main 方法的重载**:在 Java 中,`main` 方法可以被重载,即同一个类中可以有多个 `main` 方法,但请注意,程序启动时只会执行具有特定签名(`public static void main(String[] args)`)的那个。 6. **main ...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
3. 方法重载:在同一类中,方法的重载意味着可以有多个同名方法,但它们的参数列表必须不同,可以是参数个数、参数类型或参数顺序不同,而返回类型不是决定重载的关键因素。 4. Java垃圾回收:Java有自动垃圾回收...
14. Java编译器可以根据参数类型和数量正确识别重载方法,(B)错误。 15. 接口使用interface关键字定义,(B)错误。 16. 接口中只包含方法签名,不包含具体实现,(A)正确。 17. 一个类可以同时继承一个父类并...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
Scala 中使用 JSON.toJSONString 报错原因分析-解决方案 在 Scala 中使用 JSON.toJSONString ...同时,在 Java 中,使用可变长参数的方法重载可以提高方法的灵活度和可复用性,但是也需要注意方法的调用变得“模糊”。
非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...
Java重载构造原理与用法详解是Java编程语言中的一种重要概念,它涉及到方法重载、构造器、可变参数、递归算法、封装等多个方面的知识点。下面将对这些知识点进行详细的解释和分析。 一、可变参数 可变参数是Java...
在实际开发中,我们需要注意可变长参数方法的重载,因为它可能会引起Java编译器无法决定应该调用哪个目标方法,从而导致编译错误。同时,我们也需要注意重载和重写的使用场景,以免引起编译错误或逻辑错误。 理解...
5. **final与finally**:`final`是修饰符,用于声明不可变的类、方法或变量。`finally`在异常处理中用于确保某些代码无论如何都会执行,即使在try-catch块中有return、break或continue语句。 6. **数据类型转换**:...
15. Java 中的 StringBuffer:Java 中的 StringBuffer 是一个可变字符串类,提供了多种方法来操作字符串。StringBuffer 的构造方法包括 StringBuffer()、StringBuffer(int capacity) 和 StringBuffer(String str) 等...