黑马程序员技术交流社区

标题: 关于args的一点小疑问 [打印本页]

作者: 邵彩华    时间: 2013-4-3 16:19
标题: 关于args的一点小疑问
本帖最后由 邵彩华 于 2013-4-4 22:43 编辑
  1. class TestArgs {
  2.         public static void main(String[] args) {
  3.                 System.out.println(args);
  4.                 for(int i=0;i<args.length;i++) {
  5.                         System.out.print(args[i] + "\t");
  6.                 }
  7.         }
  8. }
复制代码
不论在 java TestArgs 后面输入什么值或不输入
输出结果中,都是同一个[Ljava.lang.String;@de6ced ,
即使关闭文件和命令行窗口,再重新编译运行,仍然是这个值。
我很郁闷,难道系统默认地给args参数分配了这个固定的地址吗?
作者: ㄨ____陌生    时间: 2013-4-3 16:48
args[] 在命令行运行时候输入的参数,因为参数可以为多个,所以要用数组来存。
args是Java命令行参数,在运行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参

数。 要是直接输出就会弹出  [Ljava.lang.String;@de6ced    左边的"[",可是看成数组的维度,"[["这个就是二

维数组 "L"代表这个数组是引用数据类型的数组.基本数据类型的每种类型都有自已对应的标识符.
"java.lang.String"是数组元素的类型,标识这个数组是什么类型的数组.
@后的数值表示此对象的hashCode.



作者: 庞立森    时间: 2013-4-3 20:15
你输出的是arges,这个是大家都这么写的一种习惯,什么意思呢?也就是说这个arges你可以随便写,你改写成别的也是一样的,这个public static void main(String[] args)我可以写成public static void main(String[] a),照样也是可以运行的,输出结果也一样
java.lang.String"是数组元素的类型,;@de6ced 表示此对象的hashCode.
作者: lcjasas    时间: 2013-4-3 20:24
String[ ] args表示给主方法传一个字符串数组. 而args是一个字符串数组的变量名,不是关键字,是arguments的缩写,只是一个默认名,一般都习惯性照写。你写成其他的也一样可以编译通过。
作者: 何锦权    时间: 2013-4-3 22:04
       

        这个问题,首先要从Java.lang.Object类中hashCode()的定义开始说起,
        这个传说中的上帝(Object类)的hashCode函数定义如下:
        public native int hashCode();
        加入native 这个关键字,表示这个方法是有实现体的,但是实现体是非java代码的,也就是这个函数的实现是交给操作系统来实现的,java只负责调用
        那么也就是说这个hashCode返回的值,是系统经过一定的算法返回的
        我刚刚写了一个程序测试了下,
        假如主函数里的数组名为 A,再建立了个两个数组,这个两个数组分别为B 和 C,输出A,B,C,那么输出的哈希值分别 A1,B1,C1。
        但是如果只输出 B C 那么结果就为 A1 B1       
        如果只说输出 A C 那么结果也为 A1 B1

        然后我就写了个程序把前10个对象生成的hashCode值分别写入到两个文件中,发现这两个文件的对应的值都是相同的
        import java.io.*;
        class Demo
        {
                public static void main(String[] args) throws IOException
                {
                        BufferedWriter bufr = new BufferedWriter(new FileWriter("one.txt"));
                   //这个语句占用了第一个hashCode的地址值,应该其内部运行了hashCode的方法了,然后把该哈希值占用了
                        for(int i=0; i < 10; i++)
                        {
                                Object obj = new Object();
                                bufr.write(obj.toString());
                                bufr.newLine();
                                bufr.flush();
                        }
                        bufr.close()
        }
        综上所述,我认为你说的这个值不是一定的,但是对于新建立的对象,如果调用到hashCode函数的(显示或者隐式),
        系统给这个对象所分配的哈希值则是有一定的顺序关系的

        像您写的那个类,如果主函数改成
        public static void main(String[] args)
        {
           Object obj = new Object();       
           System.out.println(obj);
           System.out.println(args);
        }
         然后就可以看出这个args的哈希值就不是之前的那个了,但同样你可以多次运行不同的程序来输出多个对象,
         输出多个不同对象的值的时候,他们的哈希值会是相对应的,这个是我经过测试,发现的规律的,
         如各位发现其有问题,希望各位能指出




作者: whs_nk    时间: 2013-4-3 22:10
本帖最后由 whs_nk 于 2013-4-3 22:11 编辑

main(String[] args)也是一个函数,String[] args是它的参数,传递的是一个String类型的数组,程序运行时的hashcode值是唯一的,传入参数的话,值也是唯一的,hashcode得到的值是计算出来的,如果不是最终类,是可以改它的计算方法的,可惜的是String是个最终类,要改的话...反正我是做不到的哦。另外,args 数组 默认元素个数为零 ,如果你在运行前传入了参数的话,那么因为args.length不为0,所以后面的for还会执行,就会打印数组里的元素
作者: 邵彩华    时间: 2013-4-4 06:43
何锦权 发表于 2013-4-3 22:04
这个问题,首先要从Java.lang.Object类中hashCode()的定义开始说起,
        这个传说中的上帝(Objec ...

你的回答给力,谢谢了:)
作者: 邵彩华    时间: 2013-4-4 06:44
ㄨ____陌生 发表于 2013-4-3 16:48
args[] 在命令行运行时候输入的参数,因为参数可以为多个,所以要用数组来存。
args是Java命令行参数,在运 ...

谢谢你的回答!
作者: 邵彩华    时间: 2013-4-4 06:46
whs_nk 发表于 2013-4-3 22:10
main(String[] args)也是一个函数,String[] args是它的参数,传递的是一个String类型的数组,程序运行时的 ...

嗯 ,谢谢你的回答!:)
作者: 康嘉    时间: 2013-4-4 09:39
hashcode的值 你可以结束java进程,刷新试试 ,把系统的缓存清除,应该可以给你换一个地址,再开辟一个空间
作者: 杨玉辉    时间: 2013-4-4 10:10
这个应该是JVM 编译之后,生成了TestArgs.class ,首次是通过类加载器加载进内存的,

当你每次要运行这段程序代码, JVM 都会先查找并返回TestArgs.class ,该字节码文件是唯一的,根据此字节码,JVM 就会默认分配一个内存空间,运行此代码,如果该内存已经被占用,就会向后顺延,分配新的内存地址,这时候的hashCode 值就会改变了,不过这些内容,了解就可以,没必要深究,

我们学习的是hashCode 的复写方法,会重新构造该值,不管他怎么分配。
作者: 打工人    时间: 2013-4-4 16:32
若还有问题,继续追问; 没有的话,尽量及时将帖子分类改成【已解决】~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2