先申明:java中的参数传递都是值传递,没有引用传递。
值传递的概念:值传递会为所传递的对象(这里的对象不是java里的对象object,而是一般意义上的对象)重新开辟一块空间,于是对所传对象的操作不会影响到原对象。
现象:有种说法是java中基本数据类型作参数是值传递,对象做参数是引用传递,我理解他的想法,在此不做任何评论。
理解:为什么对象做参数也是值传递呢?
分析:对象做参数传递的是对象的引用,暂且可以理解成对象的地址。由于是值传递,那么被传递的对象本身是不会有任何变化的,所以该对象的引用是不会发生任何变化的。
结果:abc
cba
abc
结果:
before change : a.name=a
before change : a.hashcode=18508170
after change : a.name=b
before change : a.hashcode=18508170 虽然说a.name不同了,但是引用还是一个引用,所以这里是把引用做为值传递的。
before change : i=1
after change : i=1
a1.hashCode=17237886
a2.hashCode=8187137
a1.hashCode=17237886
a2.hashCode=17237886
a1.name=a2
a2.name=a2
值传递的概念:值传递会为所传递的对象(这里的对象不是java里的对象object,而是一般意义上的对象)重新开辟一块空间,于是对所传对象的操作不会影响到原对象。
现象:有种说法是java中基本数据类型作参数是值传递,对象做参数是引用传递,我理解他的想法,在此不做任何评论。
理解:为什么对象做参数也是值传递呢?
分析:对象做参数传递的是对象的引用,暂且可以理解成对象的地址。由于是值传递,那么被传递的对象本身是不会有任何变化的,所以该对象的引用是不会发生任何变化的。
public class Yangkl
{
public void call(Test t)
{
Test t2 = new Test();
t2.setName("cba");
t.setName("abc");
System.out.println(t.name);
//这里改变了t,也就是t所代表的地址发生了变化,
//其实是所传对象的引用地址的复制发生了变化,本身对象的引用并没有变
//也就是说这里的值传递是把Test的引用作为值传递。
t = t2;
System.out.println(t.name);
}
public static void main(String args[])
{
Yangkl tYangkl = new Yangkl();
Test obj = new Test();
tYangkl.call(obj);
System.out.println(obj.name);
}
}
结果:abc
cba
abc
public class testClone {
public void changeA(A a){
a.name="b";
}
public void changInt(int i){
i=i*2+100;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
testClone test=new testClone();
A a=new A();
a.name="a";
System.out.println("before change : a.name="+a.name);
System.out.println("before change : a.hashcode="+a.hashCode());
test.changeA(a);
System.out.println("after change : a.name="+a.name);
System.out.println("before change : a.hashcode="+a.hashCode());
int i=1;
System.out.println("before change : i="+i);
test.changInt(i);
System.out.println("after change : i="+i);
A a1=new A();
A a2=new A();
System.out.println("a1.hashCode="+a1.hashCode());
System.out.println("a2.hashCode="+a2.hashCode());
a1.name="a1";
a2=a1;
System.out.println("a1.hashCode="+a1.hashCode());
System.out.println("a2.hashCode="+a2.hashCode());
a2.name="a2";
System.out.println("a1.name="+a1.name);
System.out.println("a2.name="+a2.name);
}
}
class A {
public String name;
}
结果:
before change : a.name=a
before change : a.hashcode=18508170
after change : a.name=b
before change : a.hashcode=18508170 虽然说a.name不同了,但是引用还是一个引用,所以这里是把引用做为值传递的。
before change : i=1
after change : i=1
a1.hashCode=17237886
a2.hashCode=8187137
a1.hashCode=17237886
a2.hashCode=17237886
a1.name=a2
a2.name=a2