目录
public class Test {
public static void main(String[] args) {
String s="1"; Hero h = new Hero("臭阿库娅",999);
char ch[]={'1','3'};System.out.println(s+" "+ch[1]); System.out.println(h.toString());
test(s,ch,h);
System.out.println(s+" "+ch[1]);
System.out.println(h.toString());
System.out.println(h.name);
System.out.println("结论:在方法里,引用类型改变指向的地址不会生效," +
"即引用类型形参只能改变值,不能改变指向,要改变指向就Return(深刻体现了return对引用类型的作用"); }
public static void test(String s,char ch[],Hero h){
s="g";
ch[1]='2';
h.name="wo";//未赋值新对象时改变前有效
h =new Hero("幼糖",998);
h.name="ni";
}
}class Hero{
String name;
int hp;
public Hero(String name, int hp) {
this.name = name;
this.hp = hp;
}
@Override
public String toString() {
return "\'Hero\':{" + "\'name\':\'" + name + '\'' + "," + "\'hp\':" + hp + '}';
}
}
换一种理解:
引用类型只能通过地址来达到改变值,而不能直接改变.
比如:
String q="123";//String q =new String ("123")
String q2 = q;
System.out.println("q:"+q);
System.out.println("q2:"+q);
q2="12334";
System.out.println("q:"+q);
System.out.println("q2:"+q);
q="12";
System.out.println(q2);
System.out.println(q);
综上所述Java是值传递。
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java中的传递,是值传递,而这个值,实际上是对象的引用?! 多理解一下是多个指针指向同一个地址,而改变是不是直接改变地址而是在一个新的地址中,
Test test = new Test();
test.a=2;
Test test2 = test;
test2 = new Test();
test2.a =3 ;
System.out.println(test.a +" "+test2.a);//2 3
个人理解:
即hollis作为形参时,user只是获得了它得值引用,指向同一块地址,当user改变指向(new)时,改变的只是user自己的,而没该改变hollis,如果是引用传递则hollis也会跟着改变指向。
为什么对象中的参数会改变,因为获得了值引用,能改变其内部值(毕竟指向地址一样,改变地址里的东西则都会改变,而改变地址其实只是改变指向,就无法影响原来的对象)