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

来源:互联网 发布:羽绒被 蚕丝被 知乎 编辑:程序博客网 时间:2024/05/02 21:38
说来惭愧,舍友的老婆学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也是购物卡,不过他限定卡,只能用来换面包。
争论从来都有,我其实还是倾向于值传递和引用传递这两种称呼。
0 0
原创粉丝点击