package PassRef;public class PassRef {
int x;
public static void main (String []args)
{
PassRef obj= new PassRef();
obj.x=5;
change(obj);
System.out.println(obj.x);
int x;
x=5;
change1(x);
System.out.println( x);
}
public static void change(PassRef obj)
{
obj.x=3;
}
public static void change1(int i)
{
i=3;
}
}执行结果是:
3
5说明,对象是引用传递,而普通变量是值传递。为什么
int x;
public static void main (String []args)
{
PassRef obj= new PassRef();
obj.x=5;
change(obj);
System.out.println(obj.x);
int x;
x=5;
change1(x);
System.out.println( x);
}
public static void change(PassRef obj)
{
obj.x=3;
}
public static void change1(int i)
{
i=3;
}
}执行结果是:
3
5说明,对象是引用传递,而普通变量是值传递。为什么
http://blog.csdn.net/ostrichmyself/archive/2009/10/03/4630976.aspx
PassRef obj= new PassRef();这不是new了么
Java堆和栈 内存分配
分基本数据类型和对象类型:对象类型是copy了那个引用的值,但指向任然是一个对象。
而传引用的话定义就是 形参实际上是实参的alias
基本类型的是把自己的值给传递过去,本身并不改变的
而对象的话,分为普通对象和String对象
普通对象的话,也是值传递,不过传递的是这个对象所在的内存地址,所以如果在方法体内把这个内存地址上的数据给改变了,原来的也会变
而String对象,虽然是值传递,但真正在方法体内起作用的是拷贝的值,所以原来的值并不改变
比如 void change(String s){
s = "123";
}
调用方法的时候,change(t);实际上是t=s; t="123";
调用方法的时候,change(t);实际上是
s=t; s="123";
改变的是s,而不是t
传值我就不说了,传引用是因为它是对象,想要赋值对象,你必须把内存地址传过去,所以要传引用
而后面你对x进行修改,这个是对原值的修改,所以最后输出3
第一个,对象obj储存在堆区里,对象内容被改变,对象也被改变。
第二个,X值存储在栈里,X指向5这个存储空间,操作方法作用只是对参数进行操作,并未改变栈区间X的指向。就像你去洗澡,,你是变量,浴池的功能是让你变干净,并不会把你的皮肤变白从而改变你整个人。
public static void main(String[] args) {
String str2 = new String("sss");
change1(str2);
System.out.println(str2); } public static void change1(String s){
s = "ddd";
}
}
如果对象是传的是地址 为什么这个的结果是: sss
str2和s是两个变量,在s没改变引用之前,它们的引用是相同的(这里改变的不是引用所指对象的内容)
基本类型的是把自己的值给传递过去,本身并不改变的
而对象的话,分为普通对象和String对象
普通对象的话,也是值传递,不过传递的是这个对象所在的内存地址,所以如果在方法体内把这个内存地址上的数据给改变了,原来的也会变
而String对象,虽然是值传递,但真正在方法体内起作用的是拷贝的值,所以原来的值并不改变
int x=5; // 在栈里创建一个变量x,其值为5
change(obj);// 值传递, change方法输入参数被赋值为obj的值(PassRef对象的地址)
change(x);// 值传递, change方法输入参数被赋值为x的值(5)我觉得,主要根源不是由于参数传递方式引起,而是由于使用对象时采取了类似“引用”的方式:
obj1 -> A对象,如果 obj2=obj2,则obj2 -> A对象
不管通过obj1还是obj2修改了A对象,然后再通过obj1或obj2访问A对象时都是被修改后的A对象。
不管通过obj1还是obj2修改了A对象,然后再通过obj1或obj2访问A对象时都是被修改后的A对象。