java中形参的可变参数的定义(如String... args) .

如果有下面的一个笔试题:

已知我们有如下的调用关系

logIt(”log message 1 “);

logIt(”log message2”,"log message3”);

logIt(”log message4”,"log message5”,"log message6");

请问下面的答案中哪个是正确的

A. public void logIt(String * msgs)

B. public void logIt(String [] msgs)

C. public void logIt(String... msgs)

D. public void logIt(String msg1, String msg2, String msg3)

答案:?

现在我们在coding的时候,偶尔会出现这样的一些方法:

public void paintReportChart(int i, String... args) {
        final String chartTitle;
        final String titleName;
        final String descX;
        final String descY;
        //omit the code
        ...
        chartpanel.updateUI();
        chartpanel.repaint();
}  

首先这是jdk1.5之后的新特性,我们叫它为可变参数,即 varargs 。之前我们定义可变参数是采用String[] args的方法来声明。jdk1.5之后有了更加简便的方式。

事实上String[] args 和 String... args 本质上不没有什么区别,String... args 最后还是转化成String[] args 来做的,只是String... args这种形式在应用上更加的灵活和简便。

例如有下面的两个方法:

public static void callMe1(String[] args) {
    System.out.println(args.getClass() == String[].class);
    for(String s : args) {
        System.out.println(s);
    }
}  

public static void callMe2(String... args) {
    System.out.println(args.getClass() == String[].class);
    for(String s : args) {
        System.out.println(s);
    }
} 

他们可以这样子被调用:

callMe1(new String[] {"a", "b", "c"});
callMe2("a", "b", "c");
callMe2(new String[] {"a", "b", "c"});  

但是不能

lMe1("a", "b", "c"); 

这就是String... args定义方法的灵活之处。并且当一个方法定义中有String... args形参时,实参传递的参数个数可以是少于最大个数的任意个,可以不传 参数。

但是这样子定义在方便的同时也是要付出一定的代价的,那就是String...args只能定义在形参的最后一个参数,而String[] args就没有这样的限制了。所以我们在定义的时候也就各取所需了。

通过上面的说明,我们可以知道文章开头的答案应该是选 C

所以当有一天你发现这样子定义main函数不要以为是错的

public static void main(String... args) {

//do something

}

不过要声明的是:这种方法并不是官方推荐的方法,要尽量少用为妙,不然容易出现问题。

java中形参的可变参数的定义(如String... args) .

时间: 2024-12-22 09:29:58

java中形参的可变参数的定义(如String... args) .的相关文章

java中形参个数可变的方法使用

public class Varargs { public static void main(String[] args) { test(3,"java","C++","PHP"); } public static void test(int num,String... books) { System.out.println(num); for(String book : books) { System.out.println(book); }

再学Java 之 形参个数可变函数

自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]

Java中的不可变类

本文与个人博客 zhiheng.me 同步发布,标题: Java中的不可变类. 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修改其内容. Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类. 与引用不可变的区别 需要特别注意的是,不可变类的不可变是指该类的实例不可变而非指向该实例的引用的不可变. String s = "ab

深刻理解Java中形参与实参,引用与对象的关系

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道,在Java中,除了基本数据类型之外,其他的都是引用类型,当它们作为函数参数时,传递的也是引用,通过引用可以改变对象的值,很多人便因此而忽略形参与实参,引用与对象的关系问题.废话不多说,先看下面一个例子: import java.util.*; public class Student { private String

c语言中如何实现可变参数

c语言函数库中有不少类似于printf,scanf的函数,这些函数接收的参数个数是不确定的.这些函数实际是通过<stdarg.h>文件中的va_list,va_start,va_arg,va_end宏定义是实现的.另外,我们知道程序运行时的内存结构后,也可以通过直接访问这些内存空间获得实际参数值(事实上stdarg.h文件中的相关宏定义就是这么操作的). #include <stdio.h> #include <stdlib.h> #include <stdarg

JAVA中的单例模式(采用单例模式定义的类)(转)

1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类 . 2    确保以上三点的所采用的编程策略     * 把构造方法声明为Private.确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例:    * 定义一个私有静态的该类的实例作为该类的数

MSSQL中存储过程的可选参数的定义和使用

可选参数的存在,可以极大的降低代码的重复冗余.在数据库开发中,也是如此.现在针对MSSQL中存储过程的可选参数的定义和使用进行基本的介绍,留作备忘. #准备工作: 在db_test中建立一张测试表T_test: USE db_test; CREATE TABLE dbo.T_test ( Id  INT  IDENTITY(1,1) NOT NULL ,Name  NVARCHAR(20)  NOT NULL ,Sex  BIT  DEFAULT(0) ); 插入一些数据: INSERT INT

java基础-java与c#的可变参数

正文 可变参数,必须最为参数的最后一个参数:可变参数只能有一个: c#可变参数例子: class Program { static void Main(string[] args) { Test t = new Test(); t.say("li", "wang"); Console.Read(); } } class Test { int num = 0; public void say(params string[] name) { foreach (strin

java新特性之可变参数

public class NewDemo01 {     public static void main(String[] args) {         System.out.print("No args(fun()):");         fun();         System.out.print("\n one args(fun()):");         fun(1);         System.out.print("\n five a