学过Java的同学都知道Java中函数的参数如果是Object对象的话,传的都是引用,但是下面的现象,让我对这点产生了一些怀疑.请大家帮我解惑
StringClass.java
public class StringClass {
public String m_str; public void changeStr(StringClass s){
StringClass new1=new StringClass();
new1.m_str="text1";
s=new1;
System.out.println(s.m_str); //这里,传入的s.m_str已经改变
}
}Main.java
public class Main { public static void main(String[] args) {
StringClass sc = new StringClass();
sc.m_str="Hello";
StringClass test = new StringClass();
test.changeStr(sc);
System.out.println(sc.m_str); //这里,sc_的值又回归原始的值 }输出:text1
Hello
请问这个怎么解释呢?
StringClass.java
public class StringClass {
public String m_str; public void changeStr(StringClass s){
StringClass new1=new StringClass();
new1.m_str="text1";
s=new1;
System.out.println(s.m_str); //这里,传入的s.m_str已经改变
}
}Main.java
public class Main { public static void main(String[] args) {
StringClass sc = new StringClass();
sc.m_str="Hello";
StringClass test = new StringClass();
test.changeStr(sc);
System.out.println(sc.m_str); //这里,sc_的值又回归原始的值 }输出:text1
Hello
请问这个怎么解释呢?
new1.m_str="text1";
s=new1;
这里的s不再引用外边传进来的了啊.而是引用一个新的对象StringClass new1=new StringClass(); 这里创建的.
你传一个实际参数到一个方法里去.外边的还是引用那个对象.方法的参数也引用这个(传进去的时候).但是后来在方法里,那个引用别的对象了.就不管外边传进来的了啊.
在这里,s已经不再引用外边的那个对象了.你可以改成这样试试:
public void changeStr(StringClass s){
System.out.println(s.m_str); //先在这里打印一下
StringClass new1=new StringClass();
new1.m_str="text1";
s=new1; //到这里了就不再引用传进来的对象了,而是引用刚创建的,所以下边的打印当然是打印出test1了
System.out.println(s.m_str); //这里,传入的s.m_str已经改变
}
StringClass sc = new StringClass(); --构造了对象1
sc.m_str="Hello"; --对象1的变量赋值
StringClass test = new StringClass(); --构造了对象2
test.changeStr(sc){ --声明了局部引用变量s 令其指向对象1
StringClass new1=new StringClass(); ---构造了对象3
new1.m_str="text1"; ---对象3的变量赋值
s=new1; ---局部变量s指向对象3
}
System.out.println(s.m_str); --打印出对象3的变量值
--局部变量s销毁
} System.out.println(sc.m_str); --打印出对象1的变量
第二个hello是由System.out.println(sc.m_str)打印的,sc.m_str在之前赋值为hello当然就显示hello
2.通过 s=new1; 可以知道NEW1将引用传给了S因此改变了S即NEW1将他指向的地址给了S。所以此时的S指向的不再是CS指向的地址。
3.以所在第一个输出时s.m_str是NEW1的m_str,但SC在全过程中并没有改没。