`
rongxh2010
  • 浏览: 48793 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

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

 

 

分享到:
评论
7 楼 freej 2010-04-04  
鼓励一下。
6 楼 zcq100 2010-04-03  
“但带数组参数的方法却不能传入可变参数。”

实参还有可变参数之分?
5 楼 strive_zt 2010-04-03  
在使用可变参数的时候,有一个问题需要注意:可变参数必须是方法定义中的最后一个参数,这样,也可以知道,在方法定义中的可变参数最多只能有一个。也就是说,下面的构造方法定义是非法的:
public Teacher(int id,String... dataOne,int... dataTwo)
{
//...
}
4 楼 kjj 2010-04-03  
java可变参数的本质,他就是一个数组而已,像main一样
熟悉java的人都不会往哪些莫名其妙的用途上去想的,设计师应该明白java的这个特点
3 楼 whaosoft 2010-04-02  
Z精神可嘉但你还是新手贴
2 楼 wenbois2000 2010-04-02  
思考和结论呢?
1 楼 heqishan 2010-04-01  
当这么写的时候

public class VariableParameter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		VariableParameter cp = new VariableParameter();
		cp.hello("aaaaa","bbbbbb","ccccccc");

	}
	
	public void hello(String ...parameter) {
		System.out.println("执行带可变参数的方法,参数个数为:" + parameter.length);
	}
	
	public void hello(String[] parameter) {
		System.out.println("");
	}
	
}

编辑器会提示:Duplicate method hello(String[]) in type VariableParameter ,就是说,其实编译以后,public void hello(String ...parameter)就会变成public void hello(String[] parameter),故编辑器会提示方法重复。

令:附上可变参数的使用:

/**
 * 可变参数test
 * @author heqishan
 *
 */

public class VariableParameter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		VariableParameter cp = new VariableParameter();
		cp.hello("aaaaa","bbbbbb","ccccccc");

	}
	
	public void hello(String ...parameter) {
		System.out.println("执行带可变参数的方法,参数个数为:" + parameter.length);
		
	    for (String n : parameter) {
	        System.out.println("Hello " + n + ". "); 
	      }
	}
	
}


运行结果:
引用

执行带可变参数的方法,参数个数为:3
Hello aaaaa.
Hello bbbbbb.
Hello ccccccc.

相关推荐

    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