Java-参数传递

来源:互联网 发布:顺丰科技java招聘 编辑:程序博客网 时间:2024/06/05 23:00

1>程序如下:

package com.demo.Test;public class Test {String string=new String("Hello");char[] ch={'a','b','c'};void set(String string,char[] ch){System.out.println("****before set()--string:"+System.identityHashCode(string));//(5)string="set success";//(6)ch[0]='x';//(7)System.out.println("****after set()--string:"+System.identityHashCode(string));//(8)}public static void main(String[] args) {// TODO Auto-generated method stubTest test=new Test();//(0)System.out.println("before set test-string:"+System.identityHashCode(test.string));//(1)test.set(test.string, test.ch);//(3)System.out.println("after set test-string:"+System.identityHashCode(test.string));//(4)System.out.println(test.string);System.out.println(test.ch);}}



程序运行结果如下:

before set test-string:2018699554****before set()--string:2018699554****after set()--string:1311053135after set test-string:2018699554Helloxbc

2>分析程序运行结果

2.1>程序运行(1),(2)句之后,输出对象test的变量string的System.identityHashCode为:2018699554

2.2>程序运行调用test对象的set 方法,执行第(5)句,输出参数string 的System.identityHashCode为:2018699554,可以看出是此时参数string也指向test对象的string变量所引用的内存空间;

2.3>然后执行第(6),(7),(8)句,将参数string的值置为“set success”,此时参数string 的System.identityHashCode为:1311053135,可以看出参数string指向了新的字符串,而不是修改之前指向的字符串。(这是因为,String类是不可变的,String 对象一旦生成应当会再发生改变了,对该对象重新赋值只会使该对象指向新创建的String 实例,而不是在修改原来String 对象的字符串序列)。

2.4>当set 方法执行结束后,参数string 出栈(set 方法的栈)。

2.5>set 方法执行结束后,可以看出并没有修改test对象中的string 变量值。故string 的值还为:“Hello”

3>可以再分析一下变量ch的值为什么改变了!!???



注意:

System.identityHashCode(object o)方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法不能唯一地标识该实例对象;这时可以通过System.identityHashCode(object o)方法得到根据该对象的地址得到的hashCode值。如果两个对象的System.identityHashCode值相同,则这两个对象绝对是同一个对象。


0 0