为啥 java 中只有 String[] args 而不是 Object[] args?
Posted
技术标签:
【中文标题】为啥 java 中只有 String[] args 而不是 Object[] args?【英文标题】:Why only String[] args in java instead of Object[] args?为什么 java 中只有 String[] args 而不是 Object[] args? 【发布时间】:2013-12-11 01:19:24 【问题描述】:在java中,根据Java Language Specification 12.1.4,main方法应该声明如下:
public static void main(String[] args)
//code of program
通过使用String[] args
,我们可以获得命令行参数。有时需要将这些命令行参数转换为适当的类型。假设如果您提供了任何数字 123
作为参数,并且您想将其转换为 int
,那么我们可以使用以下转换方法之一:
int n1=Integer.valueOf(args[0]);
//or
int n2=Integer.parseInt(args[0]);
但是,如果 java 可以提供使用 Objects[] args
而不是 String[] args
,那么我们可以轻松地从一种类型转换为另一种类型,例如,转换如下:
public static void main(Object[] args)
int n1=(Integer)args[0];
我不明白为什么 java 使用 String[] args
而不是 Object[] args
?
【问题讨论】:
简单。如何通过命令行传递对象? 命令行提供字符串。你如何区分字符串和整数?仅仅作为一个数值不足以将其视为整数。 Ravi - 超越我们目前所做工作的界限思考是件好事。仅供参考 - Powershell/.NET/C#/Cmdlets 实际上可以做这样的事情msdn.microsoft.com/en-us/library/ms714395%28v=vs.85%29.aspxcrazorsharp.blogspot.com/2009/12/… 【参考方案1】:Java 的设计考虑到了可移植性,因此 Java 程序可以被不同的操作环境调用。让环境将 Java 对象传递给 main
会对调用者系统施加过多的限制,因为该系统的任务是“理解”输入并将其转换为 Java 对象。
另一方面,字符串是通用的:所有操作环境都有它们。因此,Java 规范需要字符串,因为知道您的 Java 程序能够比外部环境更好地处理和理解它们。
【讨论】:
【参考方案2】:这很简单,因为args
来自外部 java 环境,它来自操作系统,因此它不能创建 Java 对象,它只能传递字符串
要从控制台调用 java 程序,应该是这样的:
c:\java MyProgram 123
Java 无法知道操作系统正在传递一个对象,它只是一个字符串。
【讨论】:
【参考方案3】:每当您从Console
阅读时,默认情况下都是String
,这就是他们将其设为String[] array
的原因。
如果你使用:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter String");
String str = br.readLine();
字符串变量str
包含字符串,因为br.ReadLine()
为您提供字符串
【讨论】:
【参考方案4】:因为您不能通过命令行参数传递对象。相反,很自然地将传递的参数解释为Strings
。
【讨论】:
【参考方案5】:public static void main(String[] args)
是执行Class文件$java MyClass input1 input2
时运行的main方法。
【讨论】:
【参考方案6】:因为操作系统不会将变量类型的参数传递给 JVM。如果您有Object[] args
,那么没有操作系统,JVM 就无法真正推断出它们的类型。这也是“标准”(例如祖先的 C/C++)Main function 的一般合同(当然是在 Java 中)。
【讨论】:
【参考方案7】:可能是因为“String”是一个字符序列数组,它占用连续的内存,可以使用标准键盘输入。否则 main 方法将如何处理类型转换。
【讨论】:
以上是关于为啥 java 中只有 String[] args 而不是 Object[] args?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的java程序明明开启了4条线程,却只有一条线程在运行?