`

Java可变参数方法重载时要注意的几个问题

    博客分类:
  • JESE
阅读更多

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默认调用的是无参数的方法。若类中没有定义无参数的方法,则会调用可变参数的方法。

分享到:
评论
1 楼 vinkeychen 2010-11-09  
学习了,博主不错哦

相关推荐

    java可变参数

    Java可变参数是Java语言中一个非常实用的特性,它允许方法接受数量可变的参数。这个特性在Java 5中被引入,极大地提高了代码的灵活性和可读性。下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ##...

    解析Java的可变长参数列表及其使用时的注意点

    在调用使用可变参数的方法时,你可以传递零个、一个或多个参数。如`printArray()`方法可以不传参数,也可以传任意数量的对象。例如:`printArray(new Integer(47), new Float(3.14), new Double(11.11))`。 4. **...

    Java参数分析

    本文将深入探讨Java中的参数分析,结合给定的资源《参数分析总结.doc》,我们将涵盖以下几个核心知识点: 1. **基本类型与引用类型参数**: - Java中有两种类型的参数:基本类型(如int, double, boolean等)和...

    Java方法.docx

    - 调用方法时,使用对象名.方法名(实参列表)的格式。如果方法有返回值,通常将其赋值给一个变量;如果方法返回`void`,则调用方法本身作为一条独立的语句执行。 3. **方法的重载**: - 重载(Overloading)是指在...

    34个java问题.pdf

    Java中的异常处理主要包括以下几个关键字:`try`、`catch`、`finally`、`throw`、`throws`。 - `try`块用来存放可能发生异常的代码。 - `catch`块用来处理异常。 - `finally`块无论是否发生异常都会执行,通常用来...

    java面试问题集锦

    如果可变参数不是最后一个,Java将无法确定何时停止解析常规参数并开始处理可变参数。 ##### 绝对路径和相对路径的区别 - **绝对路径**:从根目录开始的完整路径,明确指出文件的具体位置。 - **相对路径**:相...

    java-数组与方法及面向对象基础

    数组在Java中是存储同一类型数据的集合,可以看作是一个可变大小的容器。数组的定义和初始化通常包含以下几个步骤: 1. **声明**:指定数组的类型,如`int[] numbers`声明了一个整型数组。 2. **创建**:分配内存...

    effective-java.pdf

    静态工厂方法相比于构造方法有几个优势: - 静态工厂方法有名称,可以更清晰地说明其用途,帮助客户端代码提高可读性。 - 静态工厂方法可以返回预先构建的实例,或者缓存和重复使用对象,有助于提高性能,尤其是在...

    Java定义形式及可变参数实例解析

    Java定义形式及可变参数...可变参数方法可以接受零个或多个参数,并且可以使用数组来存储参数值。 Java 中的方法定义形式和可变参数实例解析是非常重要的知识点,对于 Java 开发者的学习和工作具有很大的参考价值。

    Java面试指南.pdf

    Java面试的准备可以分为几个部分,其中最重要的部分是Java技术相关,包括了Java的基础知识、核心API的解读以及Java中高级技术的理解。同时,面试者应该熟悉应聘流程,了解如何撰写简历,以及在面试中如何谈论福利...

    Java经典问题答案(带书签)

    - 可变参数为什么要定义在参数列表的后面:Java允许在同一个方法中使用固定参数和可变参数,但可变参数必须是参数列表中的最后一个参数。 - 绝对路径和相对路径的区别:绝对路径是完整路径,相对路径是相对于当前...

    500强经典java笔试

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

    java面试题的几个区别

    ### Java面试题的几个关键知识点解析 #### 1. String和StringBuffer的区别 在Java中,`String`和`StringBuffer`是处理字符串的两种主要方式。`String`类是不可变的,这意味着一旦创建了一个`String`对象,它的内容...

    java笔记 java笔记

    - **可变参数**:方法可以接受任意数量的同类型参数。 以上是Java的基础知识和高级特性的概述。Java是一门功能强大且灵活的编程语言,适用于各种应用场景。掌握这些核心概念和技术将有助于开发者更好地利用Java来...

    Java语法糖之个数可变的形参的实现

    个数可变的形参的优点是它可以简化代码的编写和阅读,例如,在方法中定义了多个参数,但是这些参数的个数是可变的,使用个数可变的形参可以将这些参数合并成一个数组,从而简化代码的编写和阅读。 注意事项 ---- ...

    JAVA判断题题库20151209

    - **解析:** 如果一个类没有显式定义构造方法,Java编译器会自动添加一个无参构造方法,该方法体为空。 **28. Java语言中的数组元素只能是基本数据类型而不能为对象类型.** - **答案:** 错误 - **解析:** 如同之前...

    Java基础面试题以及几个很有用的刷题网站.docx

    3. **同一类中进行方法重载**:通过在同一类中定义多个同名但参数不同的方法来实现多态。 #### 四、虚拟机如何实现多态 - 虚拟机通过动态绑定技术实现多态。在运行时确定对象的实际类型,并根据实际类型调用相应的...

    Java面试32问 面试常见问题

    从给定的文件信息中,我们可以提取出一系列与Java编程语言相关的面试问题...以上知识点涵盖了Java面试中常见的几个方面,理解这些概念对于Java程序员来说至关重要,不仅有助于通过面试,更能提升日常编码的质量和效率。

Global site tag (gtag.js) - Google Analytics