java不定参数String... args

先看两个简单的例子,来感受一下Java的不定长度参数 
第一个例子:

Java代码  

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test();
  4. test("aaa");
  5. test("aaa", "bbb");
  6. test("aaa", "bbb", "ccc");
  7. }
  8. public static void test(String... args) {
  9. System.out.println(args.getClass());
  10. for (String arg : args) {
  11. System.out.println(arg);
  12. }
  13. }
  14. }

第二个例子:

Java代码  

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test("aaa");
  4. test("aaa", "bbb");
  5. test("aaa", "bbb", "ccc");
  6. }
  7. public static void test(String arg, String... args) {
  8. System.out.println(arg);
  9. System.out.println("----------------");
  10. for (String s : args) {
  11. System.out.println(s);
  12. }
  13. }
  14. }

读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。 
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。 
    不过,不定参数有两个规定第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。 
    对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始. 
    对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。 
    以下是几种不正确使用不定长度参数的例子,请不要这样写程序:

Java代码  

  1. public static void test(Object... objs, Object obj);
  2. public static void test(Object obj1, Object... objs, Object obj2);
  3. public static void test(Object... objs1, Object... objs2);

不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同) 
   下面给出重载的示例:

Java代码  

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test("aaa");
  4. test("aaa", "bbb");
  5. test("aaa", "bbb", "ccc");
  6. }
  7. public static void test(Object... args) {
  8. }
  9. public static void test(String arg, String... args) {
  10. }
  11. }

读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。 
   然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:

Java代码  

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test();
  4. test("aaa");
  5. test("aaa", "bbb");
  6. test("aaa", "bbb", "ccc");
  7. }
  8. public static void test(String... args) {
  9. System.out.println(args.getClass());
  10. for (String arg : args) {
  11. System.out.println(arg);
  12. }
  13. }
  14. public static void test(String arg, String... args) {
  15. System.out.println(arg);
  16. System.out.println("----------------");
  17. for (String s : args) {
  18. System.out.println(s);
  19. }
  20. }
  21. }

读者可以编译下这个程序,结果是编译不通过。为什么呢?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

时间: 2024-10-08 00:49:20

java不定参数String... args的相关文章

java程序中String args[]起什么作用?

在下面这个程序中String args[]起什么作用?我学过C++,String args[]与C++中的什么类似?如果是C++,想要输出字符串只要在下面写cout<<"...."<<endl;就可以了,void main()中的括号为空,而java中为什么要写String args[]呢? class Example{ public static void main(String args[]){ System.out.println("This i

main方法中参数&quot;String[ ] args&quot;详解

1.在编写完一个有主方法的java文件时,需要在cmd窗口中先编译此java文件(javac xxx.java),然后再运行(java xxx) 其实在运行java xxx的时候如果后面跟着参数用空格分开,则将这参数保存到了String类型的数组中也就是main方法 的参数String [] args中 2.方法测试 public class HelloWorld { public static void main(String[] args) { if(args.length != 2){ S

java程序main方法的参数String[] args

public class ArgsTest { public static void main(String[] args) { System.out.println(args.length); for(int i=0;i<args.length;i++) { System.out.println(args[i]); } } } javac ArgsTest.java编译程序. 执行java ArgsTest运行程序. 此外,java中也可以使用Scanner从键盘获取输入. import ja

Java中main函数参数String args[] 和 String[] args 区别

其实没什么区别的:当初我也是这样的疑问,呵呵:非要说区别就看下面:执行效果上没有不同, 但在语法意义上略有不同. 比如, String与String[], 前者叫字符串类型而后者叫字符串数组类型. String args[]单从类型上来讲属于字符串类型, 而从变量本身来讲是一个数组类型, 因此组合起来说明此变量为一个字符串类型的数组, 也就是说数组中的所有元素都为String类型. String[] args单从类型上来讲属于字符串数组类型, 而从变量本身来讲就是一个单纯的引用变量, 因此这种方

Java中的String[] args

在每个java程序中都有一个方法,public static void main(String[] args)方法,这个参数看了好久没看懂,但是细细看来,还是挺简单的,所有的方法的参数都是一个道理,而这个main方法有所不同的是:它是所有方法中最先运行的一个,所以没有其他方法给它传递参数,所以需要靠运行时命令行输入参数,所以String args,接收的是命令行的输入, package Test_main; public class Test_main { public static void

C#控制台基础 VS2017中为控制台程序设置启动参数(string[] args)

os :windows7_x64 ide:vs2017 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { foreach (var str in args) {

有关 java 不定参数

不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能是,形参的最后一个参数 public static int sum(int... values) } // 3. 不定参数直接当做数组来使用 private static int sum(int... values) { int sum = 0; for (int i = 0; i < values

C# static void Main(String[] args) 中参数String[] args 的理解

定义一个String[]类型的数组args,表示从命令行传入的参数(类似于Java) ,假如在命令行输入: 1 d:\A.exe a ab abc 表示在d盘的根目录下执行A.exe 这个可执行文件,传入参数有3个分别是 a ab abc   ,即args[0]="a"  , args[1]="ab" ,args[2]="abc"

JAVA:从public static void main(String args[])开始

我们都知道当你要运行一个JAVA文件的时候必须要有一个main函数.这是为什么呢? 跟C语言的道理一样,当你运行一个文件的时候,你必须要有一个入口函数或者入口地址,在C里面是main函数,同样的在JAVA里面则是public static void main(String args[])这样一个入口函数.这是java程序的入口地址,java虚拟机运行程序的时候首先找的就是main方法.跟C语言里面的main()函数的作用是一样的.只有有main()方法的java程序才能够被java虚拟机欲行,可