A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lucy198921 中级黑马   /  2013-3-21 21:29  /  1347 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lucy198921 于 2013-3-22 21:08 编辑

这个问题有点不明白.

class  Test
{
        public static String[] args = {"gg","ss","dd","dal"};
        public static void main(String[] args){
             System.out.println(args.length);
        }
}


打印出来的结果怎么是0,却不是4呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

7 个回复

倒序浏览
第一个args是类的字段属性,第二个是main函数的局部变量,局部变量你没有赋值,再说main方法和Test这个类没有关系。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你这个String[] args = {"gg","ss","dd","dal"} Test类的一个成员而已,并没有传给主函数作为参数.如果你用的是eclipise 在run as 时选config argments
把String[] args = {"gg","ss","dd","dal"}复制进去 作为参数传给主函数.结果就是4了.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
String[] args = {"gg","ss","dd","dal"}你里面还没赋值进去,所以它的默认值都是为0

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 胡国彬 于 2013-3-21 22:11 编辑

因为你外部有一个全局变量args,main方法里面还有一个局部变量args,一个方法里面,如果要调用参数的值,如果局部变量和全局变量重名,默认会调用局部变量.也就是在这里,调用的是main的参数args.如果你想要结果是4,很简单,只需要把main的参数args的名称改变,或者把全局变量的args的名称改变,结果就是4了.
另外,两个args虽然重名,但是是不同的对象,也就是在内存中是不同的地址
还有,外部的args相当于普通的变量,而main方法的args虽然可以和外部的变量一样用其他的名字命名,但是是有区别的,这个main方法的参数String[] args是在运行时由虚拟机自动初始化的,而且,main方法是用来接收运行时输入的参数的.比如你运行Test.class文件时,输入以下命令:
java Test you me
"you"和"me" 两个字符串就保存在args里面
测试:
在Hello.java加上输出args[]的代码
main(string args[]) {
System.out.println(args[0] +"\n" + args[1]
}
这个时候是可以打印出你输入的you 和me的

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
首先,关于String[] args的意义:

    在public static void main(String[] args)语句中,

    String[] args表示main方法的入口参数,是一个字符串数组。此字符串数组中的元素是在执行程序时输入的命令行参数。

    其中的args是Java命令行参数,我们在DOS中执行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参数。

其次,关于作用域的问题

    当一个变量被定义的时候,它的作用域就被确定了。

    按作用域的不同,变量可以分为以下类型:
  
     1.成员变量 在类中声明,它的作用域是整个类

     2.局部变量 在方法内部或者方法的一个代码块的内部声明 如果在一个方法内部声明,它的作用域就是整个方法 如果在一个方法的某个代码块的内部声明,他的作用域就是这个代码块 代码块:位于一个{}以内的代码。

    3.方法的参数 方法或者构造方法的参数,他的作用域是整个方法或者构造方法。

通过以上两点可以知道,在主方法内的args是String[] args中的args,而不是外面的args.

在Eclipse中,光标置于某个变量处,可以方便地看出哪个是跟他同一个。

祝你进步!!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
第一个args是静态的成员变量(全局的),而第二个args是方法中的参数变量(局部的),当System.out.println(args.length);运行时就找他最近的args即参数变量,但发现他是空的所以结果是0。如果想用成员变量可以用this来指定,程序就可以知道args是成员变量不是参数变量。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马