本帖最后由 了无尘 于 2012-3-14 21:28 编辑
public class Demo
{
public static void main(String[] args)
{
System.out.println("Hello Word!");
}
}
public class Demo
{
public static void main(String[] args)
{
System.out.println(args[0]);
}
}
public class Demo
{
public static void main(String[] args)
{
if((args.length == 2) && (args[0] == "-str"))
{
System.out.println(args[1]);
}
else if(args[0] == "-help")
{
System.out.println("-str [参数] 打印指定的字符串");
}
else
{
System.out.println("参数不合法");
}
}
}
如果运行的话,发现是不行,会打印参数不合法,如果在else里加一个输出打印args[0]的话,会发现打印出来的确实是我们所输入的命令。
原因在哪里呢,字符串本身""这样用就是个对象,而从控制台传进来的字符串虽然跟这个""的字符串是一样的成员参数,但是他们却是完全不一样的两个对象。对于这种应该用的是String类中的equals方法,虽然Object类里用的是==,但是String类把他重写了,实现方面是比较两个字符串的字符序列是否相等,而不是比较两个对象是否相等。
System.out.println(new String("123")==new String("123"));
System.out.println(new String("123")=="123");
System.out.println("123"=="123");
从上边的代码可以看出来,第一行为false,即新创建的两个对象,虽然值相等,但对象是不等的,就好像两个都叫张三的人,实际不是一个人一样。
第二行也是false,而第三行却为true。这里有个地方需要注意,"123"的创建是肯定的,即在内存中没有这个字符串时,虚拟机会创建一个"123"的字符串对象,如果你new("123"),实际上我们都知道new是新建的意思,就是创建了一个新的值为"123"的对象。拆分一下这个过成,首先创建一个"123",并把这个对象作为参数传递给String的构造函数并生成一个新的对象,这也就好理解了为什么第二行是false。
第三行这里需要说的是为什么为true,这个在上边也说了,就是你两次"123"无论调用的代码写在哪里,只要是这种的,都会先查找是否有这个字符串,如果有,那么就相当于直接这个引用拿过来,如果没有就新建。
最后的代码应该是这个样子的
public class Demo
{
public static void main(String[] args)
{
if((args.length == 2) && (args[0].equals("-str")))
{
System.out.println(args[1]);
}
else if(args[0].equals("-help"))
{
System.out.println("-str [参数] 打印指定的字符串");
}
else
{
System.out.println("参数不合法");
}
}
}
命令行果然蛋疼,做命令行程序更蛋疼 要是javac和jar都是可视化的工具多好
我博客的原文地址
http://blog.sina.com.cn/s/blog_3e984d1901014d92.html |