您的位置:首页 > 编程语言 > Java开发

java中值传递和引用传递辨析

2014-03-13 18:03 155 查看
说来惭愧,舍友的老婆学java,让咱给指导一下,结果出丑了。就起原因基础知识不扎实,也罢,努力吧,骚年。

有人说java中只有值传递,没有引用传递。有人持反对意见,反正各自有各自的理论,其实这都不重要,重要的是

理解其中的原理,没有必要抠字眼。

public class ThisEscape {

public static void main(String[] args) {

ThisEscape te= new ThisEscape();

te.fromStr();

}

public void fromStr(){

int i = 0;

String str = new String("123");

Person person=new Person("Tom");

List<String> list= new ArrayList<String>();

toStr(i,str,person,list);

System.out.println(i);

System.out.println(str);

System.out.println(person.name);

System.out.println(list.size());

}

public void toStr(int i ,String str,Person person,List list){

i=1;

str="234";

person.name="Cat";

list.add("list");

}

}

class Person{

public String name;

Person(String str){

this.name=str;

}

}

结果:

0

123

Cat

1

结论:int类型和String类型的值没有改变,实例对象的变量发生了改变。

函数的参数进行传递是分两类:

基本数据类型和String对象(特殊总是它)进行传递时,使用的是值传递,其余以外的是引用传递。

再进一步,其实与数据的存储有关。

基本数据类型存储在栈内存中,在进行函数参数传递时,将存储单元中的数值传递给函数,成为局部变量,

当调用完成后,局部变量销毁,与被传递的参数无关。String首先不是类型,确切的说是对象,他是java的

干儿子,特殊对待,处理的时候模式和基本类型这些亲儿子一样处理。最后就是其实值传递的是内存中的

值,而非地址或者引用。

至于实例被传递的时候,先说存储,new一个对象的时候,其实是分两步存储的,一部分存在栈中的引用变量,另一部分

则是存储在堆中的实体对象。此时调用函数传递对象时,传递的对象的引用,并非是实体对象。在函数内部的操作实际是

针对该对象引用变量的操作而非实体对象。你可以改变这个引用变量的指向实体对象,也可以对引用变量指向的实体进行

操作。

举一下例子,值传递引用给你可能只是一个面包,而引用传递给你的可能是一个购物卡,你可以用它买面包,也可以买牛奶。

基本数据类型就是各种口味的面包,String也是购物卡,不过他限定卡,只能用来换面包。

争论从来都有,我其实还是倾向于值传递和引用传递这两种称呼。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: