关于java中值传递的总结

来源:互联网 发布:登录mysql命令 编辑:程序博客网 时间:2024/06/03 03:39

有网友说道:在java里没有引用传递,只有值传递。但是“引用传递”字眼总是出现。为什么呢?

其实两个说法其中的原理是一样的,只要咱们懂得其中的原理,那么至于叫什么也就无所谓了。毕竟计算机也不认识汉字。


java中创建并初始化一个String对象,最常见的方式有两种: 

String str=new String("XXX"); 

String str="XXX";    


      二者看似相同,其实有很大的差别。 
      前者是java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象;后者则会在栈中创建一个对象引用变量str,然后 查看字符串池中是否存在"XXX",如果没有,则将"XXX"存放字符串池,并令引用变量str指向它;如果已经有"XXX",则直接令str指向它。这样充分利用 了栈的数据共享优点,当然也可能是一个陷阱,对象很有可能没有创建,只不过指向一个先前已经创建的对象;而new()方法则能保证每次都创建一个新的对 象。 
      下述代码展示了二者的不同: 
Java代码   
 public class Main {  
    public static void main(String[] args) {  
String strA = "abc";  
String strB = "abc";  
String strAA = new String("abc");  
String strBB = new String("abc");  
 System.out.println(strA == strB);  
 System.out.println(strAA == strBB);  
  }  
 }  

输出结果: 
true 
false 
字符串限定是指String s = “abc”这种形式,也就是说String s1 = “abc”; 
s 和 s1 都是指向同一个内存地址 
String s = "abc"; 
这句是定义一个String变量s,jvm会先去字符串池中找有没有"abc",有的话就把s指向"abc",没有就会先在池中创建一个,再让s指向"abc"。 
String s = new String("abc"); 

这句是先定义一个String变量s,然后在内存中分配新的空间"abc"再让s指向这个内存地址


那么问题来了:

public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };

public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}

public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}


答案是:good and gbc

原创粉丝点击