Java中引用传递仍是值传递的问题

我喜欢的一篇文章在这儿:传送门html

总结:ide

  1.虽然这篇文章没有提到值传递和引用传递两个概念,可是确解决了它们的根本问题。由于函数调用实际上也是给形参赋值的意思。函数

  2.由于值传递所研究的目的是,实参不随形参的改变而改变,即实参先后相同。spa

    引用传递所研究的目的是,实参随形参的改变而改变,即实参先后不一样。code

  3.要看实参是否改变,须要知道一个知识:Java里面的==号,比较的是两个引用是否指向同一块内存。htm

  例如:blog

    
1         String str1 = new String("1");
2         String str2 = new String("1");
3         System.out.println(str1 == str2);
View Code

    打印false,由于在堆中不能共用相同值的内存,str2必须用new在堆中从新申请内存。即str1和str2分别指向不一样的内存,所以为false。内存

  再例如:get

    
1         String str1 = "1";
2         String str2 = "1";
3         System.out.println(str1 == str2);
View Code

    打印true,由于栈中能够共用内存,str2不用再在栈中申请内存了。即str1和str2指向同一块内存,所以为true。event

  4.有了上面3条知识,就能够再考虑参数传递仍是值传递了。

    Java进行函数调用。就是将实参的引用赋给形参,也就是将实参所指的内存地址赋给形参。

    ①:实参所指地址在栈中,无论怎么改变形参,都会在栈或堆中建立新的空间,不会改变实参的空间。

    ②:实参所指地址在堆中,则形参修改堆中的数据,会影响到实参所指的空间值。

  5.究竟是值传递仍是引用传递?值传递,由于引用永远不会改变(慢慢体会)。会变得只有引用所指的内存存储的内容。

 

扩展:从堆和栈的特性考虑问题,还能够解决String和new String的问题,解决方法同理。

相关文章
相关标签/搜索