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也是购物卡,不过他限定卡,只能用来换面包。
争论从来都有,我其实还是倾向于值传递和引用传递这两种称呼。
有人说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也是购物卡,不过他限定卡,只能用来换面包。
争论从来都有,我其实还是倾向于值传递和引用传递这两种称呼。
相关文章推荐
- JAVA中值传递和引用传递的三种情况
- Java中值传递、引用传递
- java中值传递和引用传递的区别
- Java中值传递与引用传递
- 黑马程序员_java中值传递和引用传递区别
- java中值传递还是引用传递探究
- java中值传递和引用传递
- java中值传递与引用传递详解
- Java中值传递与引用传递
- Java中值传递和引用传递实例
- java中值传递与引用传递
- Java中值传递和引用传递的区别
- 再次学习java语言中值传递和引用传递
- java中值传递和引用传递
- Java 中值传递与引用传递的区别
- Java中值传递的实质,形式参数与实际参数。引用传递。
- java中值传递和引用传递
- Java中值传递和引用传递
- java中值传递和引用传递
- 复习:java中值传递和引用传递(java基础教程)