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

JAVA可变参数方法及它的重载

    博客分类:
  • Java
阅读更多

JAVA支持方法的可变参数。类似如下

public void method1(String... arg1);

 这样,调用method1时候,参数的数量是可变的,如method1("1","2","3")。注意可变参数只能是最后一个参数。

JAVA内部是把这样的参数看成一个数组来处理。在获取多个参数的时候可以用数组遍历来完成。

for (String temp : arg1) {
      System.out.println("one of the arguments is " + temp);
}

 可能有人会说,这样的循环遍历像List那样的集合也可以,凭什么说是数组。那好,再看下面代码:

public void method1(String... arg1);
public void method1(String[] arg1);

 这样的重载,在编译时候会报错,JAVA不允许这样的重载,其实理由很简单,String... 和String[]对编译器来说是一样的。参数一样自然无法重载。

 

下面讲可变参数方法的重载:

 

	public void method1(String... arg1) {
	}
	
	public void method1(String a, String... arg1) {
	}

 我在eclipse中测试,IDE并没有提示错误。但是在实例后调用就不行了,IDE报“The method method1(String[]) is ambiguous for the type ...”,大致是说这个方法有混淆,无法正确的调用。话说类编译的时候没问题,到实例后调用就会提示错误。

 

 

        public void method1(String... arg1) {
		System.out.println("1");
	}
	
	public void method1(String a, String b) {
		System.out.println("2");
	}

 上述是完全可以的,但是如果方法被调用是输入的参数是2个的时候,到底上面哪个会被调用呢。答案是参数固定那个。能匹配定长的方法,那么优先匹配该方法。含有不定参数的那个重载方法是最后被选中的。

 

 

之前对可变参数方法及这种方法的重载也就个模糊的影像,在开发中偶尔用下,昨天遇到了个奇怪的问题。

定义了两个方法:

protected List executeQueryMultiplyResult(String sql, Object... params);
protected List executeQueryMultiplyResult(String sql, Class<T> arg, Object... params);

 一开始很正常,比如executeQueryMultiplyResult("sql", a.class, new Object[]),这种调用能正确的调用上述的第二种。昨天,因为设计的需要,把这两个方法pull up到了父类中去。结果就有了问题,有些能正确调用,有些却不能。如果都不能,也就当时编译器无法正确区分这两个。网上差了好多可变参数方法的重载问题,我都没有犯那些错误。调试了半天,后来发现在IDE代码只能不全的时候提示第二种方法的第二个参数是固定的。自己研究了下代码,原来Class<T> arg中的T是泛型,子类在继承父类时指定了这个泛型。所以这边,实际arg参数实际已经固定了。如果子类的T是类a,那么如果传a.class,就会选择第二个方法,如果传入了其他,如b.class,就变了第一种方法,Object也是包含了Class的。唉,滥用泛型导致的错误啊。

 

分享到:
评论

相关推荐

    java可变参数

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

    Java可变参数demo

    在这个名为"Java可变参数demo"的示例中,开发者通过分析Android蓝牙框架层的源码,对Java的可变参数有了更深入的理解,并编写了一个小的演示程序以备后用。下面我们将详细探讨Java可变参数的相关知识点。 1. 可变...

    java可变参数.pdf

    Java中的可变参数(Varargs)是一种语法特性,允许开发者定义接受不定数量参数的方法。这在实际开发中非常有用,特别是在实现方法重载或者想要简化代码时。可变参数在Java中自J2SE 1.5版本起被引入。在可变参数方法...

    Java的可变参数讲解代码(使用方式、原理、结合泛型、使用元组或列表进行参数传递、 使用默认值、缓存计算结果、实战构建动态日志)

    Java可变参数(Varargs)是一种语言特性,允许方法接受可变数量的参数。在方法声明中使用省略号(...) 表示,可以将不定数量的参数传递给方法。可变参数使得方法更加灵活,可以接受任意数量的参数,并以数组形式访问...

    Java可变参数列表详解

    Java可变参数列表,也称为不定参数,是Java语言中的一种特性,允许方法接收数量可变的参数。这种特性在编程时提供了极大的灵活性,尤其是在处理不确定数量输入的情况下。以下是关于Java可变参数列表的详细解释。 1....

    大数据必学Java基础(二十七):详述main方法和了解可变参数

    在大数据领域,掌握Java基础至关重要,特别是main方法和可变参数,因为它们是编写任何Java程序的基础。 详述main方法: 1. **main方法说明**:main方法是Java程序的主方法,它告诉JVM从何处开始执行代码。当JVM...

    java 方法重载

    2. 避免使用可变参数列表(如`...`)作为唯一区别,因为这样可能会导致难以预料的行为,尤其是在方法内部需要处理可变参数列表的情况下。 3. 使用方法重载时,应保持方法功能的一致性,避免引起误导。如果两个重载...

    java中的可变参数使用方法

    Java中的可变参数(Variable-Argument Parameters)是自Java 1.5版本引入的一个特性,它允许我们在方法声明中使用省略号(...)来表示一个可变数量的参数。这个特性大大增强了Java方法的灵活性,使得我们能够以更加...

    Java方法的艺术:重载与重写的深度解析

    ### Java 方法的艺术:重载与重写的深度解析 在 Java 编程语言中,方法的重载(Overloading)和重写(Overriding)是面向对象编程的重要概念。这两种技术使得方法能够在不同的上下文中表现出不同的行为,从而增强了...

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

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

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

    Java的可变参数列表(Variable Argument List),也称为varargs,是自Java 5引入的一项特性,它允许方法接受一个可变数量的参数。这种机制使得编写接受任意数量相同类型参数的方法变得更加方便。在使用可变参数时,...

    Java方法常见面试题及答案

    理解并熟练掌握Java方法的概念、定义、调用、参数、返回值、重载、重写、递归以及可变参数等知识点对于任何Java开发者来说都是必要的。 1. **Java方法定义**: - 一个Java方法通常由修饰符、返回类型、方法名、...

    java东方标准大唐电信

    如果需要处理多组不同类型的可变参数,可以通过重载方法来实现。 4. 编译器处理方式 在编译阶段,Java编译器会将可变参数视为一个一维数组。这意味着在函数内部,你可以像处理数组一样处理这些可变参数。例如,你...

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

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

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    本教程将深入探讨如何在重载方法中利用Varargs(可变参数)技术,这是一项非常实用的功能,能够使方法接受任意数量的相同类型参数。此资源包包含了相关的源代码实例和详细教程,帮助你更好地理解和应用这一概念。 ...

    Java参数分析

    - 自Java 5起,引入了可变参数,允许一个方法接受任意数量的同一类型的参数。这在实现灵活的函数接口时非常有用,例如`public void printNumbers(int... numbers)`,这个方法可以接受零个、一个或多个整数。 6. **...

    Java面向对象(基础)-方法应用

    Java面向对象(基础)-方法应用 一、方法的重载 ...Java 中的方法可以有多种形式,包括方法的重载、可变个数形参的方法、方法值传递机制和递归方法。这些特性使得 Java 程序设计更加灵活和强大。

    Java方法.docx

    这段代码中的`printMax`方法就是一个使用可变参数的例子,它可以接收任意数量的`double`类型数值,并找出其中的最大值。在`main`方法中,我们通过数组`numbers`调用了`printMax`方法,实现了对一组数字的最大值求解...

    函数参数:可变参数

    C++也有类似的功能,使用`std::initializer_list`或者重载操作符`()`来实现可变参数。例如: ```cpp template void varArgs(Args... args) { // 使用展开元组的技术遍历所有参数 (std::cout ) ; } int main() { ...

    Java中带参带返回值方法的使用共3页.pdf.zip

    带参数和返回值的方法是Java方法的一个重要类型,它们使得代码的复用性和模块化设计变得更为高效。本篇将深入探讨Java中带参数和返回值的方法,以及如何在实际开发中有效利用它们。 一、方法的定义与调用 1. 定义...

Global site tag (gtag.js) - Google Analytics