public class Pass {
String a;
public static void test(Pass s){
s.a="av";
}
public static void main(String[] args) {
Pass s=new Pass();
s.a="222";
test(s);
System.out.println(s.a);
}}
打印出来的是 av
Pass a是传引用
但是代码改成这样
public class Pass {
String a;
public static void test(Pass s){
s=null;
}
public static void main(String[] args) {
Pass s=new Pass();
System.out.println(s);
test(s);
System.out.println(s);
}}
打印的是
testString.Pass@6d8dfef8
testString.Pass@6d8dfef8
是一样的,这个是为什么?
String a;
public static void test(Pass s){
s.a="av";
}
public static void main(String[] args) {
Pass s=new Pass();
s.a="222";
test(s);
System.out.println(s.a);
}}
打印出来的是 av
Pass a是传引用
但是代码改成这样
public class Pass {
String a;
public static void test(Pass s){
s=null;
}
public static void main(String[] args) {
Pass s=new Pass();
System.out.println(s);
test(s);
System.out.println(s);
}}
打印的是
testString.Pass@6d8dfef8
testString.Pass@6d8dfef8
是一样的,这个是为什么?
1,你在调用test方法的外面有一个引用s,打印它,这个首先可以明确没问题吧
2,test方法里面的s,是另外一个引用,只不过和方法外的s指向同一个对象。
3,然后test里面的引用s被指向null,而方法外面的s没有受任何影响,仍然指向前面new出来的对象。前后两种写法不一样的原因是:
第一种写法的test方法里面,你通过引用操作了对象,修改了对象:
s.a = "av"
第二章写法的test方法里面,你并没有通过引用操作对象,而是直接将引用指向了另外一个对象(这里是null),所以在这里你并没有改变原对象。当然你更不可能改变另外一个引用仍然指向原对象。