【问题标题】:What does "String[] args" contain in java?java中的“String[] args”包含什么?
【发布时间】:2011-08-23 00:11:01
【问题描述】:

当我运行以下程序时:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println(args);
    }
{

打印:[Ljava.lang.String;@153c375

当我再次运行它时,它会打印:[Ljava.lang.String;@1d1e730

它每次都给我不同的输出

那么,“[Ljava.lang.String;@153c375”是什么意思?

【问题讨论】:

    标签: java


    【解决方案1】:

    更新:我刚刚意识到我从未回答过这个问题““String[] args”在 java 中包含什么?” :-) 这是一个命令数组提供给程序的-line 参数,每个参数是数组中的String

    我们现在继续我们定期安排的答案...

    args 是一个数组。要查看单个命令行参数,请对数组进行索引 - args[0]args[1] 等:

    你可以像这样遍历参数:

    public class Test
    {
        public static void main(String[] args)
        {
            int index;
    
            for (index = 0; index < args.length; ++index)
            {
                System.out.println("args[" + index + "]: " + args[index]);
            }
        }
    }
    

    对于java Test one two three,将输出:

    args[0]: 一个
    args[1]:两个
    args[2]:三个

    如果不需要索引,也可以这样循环:

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

    那么,"[Ljava.lang.String;@153c375" 是什么意思?

    这是String[]String 的数组)的默认 toString 返回值。见Object#toString[ 表示“数组”,L 表示“类或接口”,java.lang.String 是不言自明的。那部分来自Class#getName();@153c375;@ 后跟数组的 hashCode 作为十六进制字符串。 (我认为ObjecthashCode 的默认实现表明数组在内存中的位置,这就是为什么它对于程序的不同调用有所不同,但这是未指定的行为,无论如何对你没有任何用处。 )

    【讨论】:

      【解决方案2】:

      main方法中的String[] argscommand line arguments的String数组。

      [Ljava.lang.String;@1d1e730 是类名([Ljava.lang.StringString[])和对象的哈希码(@1d1e730);

      如果要打印数组中字符串的实际值,可以使用简单的 for-each 循环:

      for(String arg:args)
          System.out.println(arg);
      

      【讨论】:

        【解决方案3】:

        它是name mangling 的一种形式,用于消除方法重载的歧义。方法名称附加了一系列描述参数和返回类型的字符:参数顺序出现在括号内,返回类型跟在右括号后面。代码如下:

        • Z:布尔值
        • B:字节
        • C: 字符
        • S:短
        • 我:int
        • J:长
        • F: 浮动
        • D:双
        • L 完全限定类名; : 完全合格的类
        • [类型:类型数组
        • V:无效

        所以根据上面的代码[Ljava.lang.String;@153c375

        字符串数组(java.lang.String 完全限定的类名),后跟 hascode。

        【讨论】:

          【解决方案4】:

          String[] args 是一个字符串数组,包含应用程序启动时给出的参数。 Java 不要求您使用名称 args,您也可以指定 String[] foo,但如果您稍后再次阅读您的代码,这会使事情变得不清楚。

          【讨论】:

            【解决方案5】:

            Object 的toString 方法的默认实现是classname;@identityHashCode。 我想,这就是你所期望的:

            System.out.println(java.util.Arrays.toString(args));
            

            【讨论】:

              【解决方案6】:

              这是一个字符串数组。

              1. 将您的代码修改为:
              public class Test{
                 public static void main(String[] args){
                     System.out.println(args[0]);
                 }
              }
              
              1. 现在编译这段代码:

              $>javac Test.java

              1. 现在运行:

              $>java 测试你好

              这将打印:“你好”

              因为“hello”是您传递给班级的参数。

              如果您尝试:args[x], where x=0..n 并通过命令行运行您的类:java 测试您的参数,然后您将看到您传递的任何内容..

              【讨论】:

                【解决方案7】:

                main 方法有一个参数,它是一个字符串引用数组。 因此,每次您尝试打印 args 时,它都会为您提供数组 'args' 的内存位置,因为此 String 数组 args 在内存中为数组元素定位了一个位置。

                也就是说,您有一个名为“HelloWorld.java”的简单程序,如下所示:

                public class HelloWorld
                {
                    public static void main(String [] args)
                    {
                        for(int i =0; i<args.length; i++)
                            System.out.println(""+args[i]);
                    }
                }
                

                准备用命令行界面测试这个程序:

                java HelloWorld a b c
                

                我们可以看到这个程序在 'java Helloworld' 之后打印了 thouse 参数 一种 b c

                【讨论】:

                  【解决方案8】:

                  让我们变得简单

                  1:编写一个名为“test”的简单类

                  public class test {
                      public static void main(String[] args) {
                          System.out.println("Passed argument is: " + args[0]);
                      }
                  }
                  

                  2:现在按如下方式编译

                  javac test.java
                  

                  3:现在通过传递参数来运行它

                  java test Ayoub
                  

                  ** 输出将是**

                  Passed argument is: Ayoub
                  

                  【讨论】:

                    猜你喜欢
                    • 2015-09-06
                    • 2013-12-11
                    • 1970-01-01
                    • 2014-02-22
                    • 2012-10-21
                    • 2014-06-22
                    • 2010-10-18
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多