赋值的真相

1 赋值是将右边的值复制给左边,右值是任何的常数变量和表达式,左值必须是一个明确的已命名的变量,就是必须是已经定义了物理空间用来存储值。 基本类型的赋值是复制,对基本类型a=b 之后要是改变a的值,不会影响到b的值 因为他们都是基本类型存放在栈中。
而对于复杂的类型,为对象赋值则不是这样,对象的存储其实是在栈中放的是对象的引用,真正的储值是在堆中的,将一个对象赋值给另一个对象实际上是将该对象的引用赋给,这样就是栈中定义的两个变量引用了同一块的堆中的内容,结果是其中一个对象值发生变化,另一个也同样变化。此时的赋值 相当于给一个“别名”。
因此 如果两个对象希望复制成员变量的值,需要对每个变量进行赋值,而不是对象直接复制。

java中 堆栈中存放的是变量的引用,真正的内容是放在堆中的,但是由于基本类型很小,所以也放在堆栈中。
package cn.tommy.learning.tij;

import i.tommy.utils.printUtil;
import static i.tommy.utils.printUtil.*;
public class refObjectTest
{

/**
* @param args
*/
public static void main(String[] args)
{
Person a=new Person();
Person b=new Person();
a.age=32;
b.age=25;
print("first: age of a:"+a.age+"; age of b"+b.age);
a=b;
print("first: age of a:"+a.age+"; age of b"+b.age);
a.age=67;
print("first: age of a:"+a.age+"; age of b"+b.age);
a.age=31;
print("first: age of a:"+a.age+"; age of b"+b.age);


}

}

class Person
{
int age;
}


结果:
first: age of a:32; age of b25(2)
first: age of a:25; age of b25(2)
first: age of a:67; age of b67(2)


2
如果main函数改成
package cn.tommy.learning.tij;

import i.tommy.utils.printUtil;
import static i.tommy.utils.printUtil.*;
public class refObjectTest
{
Person a=new Person();
Person b=new Person();
a.age=32;
b.age=25;
print("first: age of a:"+a.age+"; age of b"+b.age);
a.changeAge(b);
print("first: age of a:"+a.age+"; age of b"+b.age);

}

}

class Person
{
int age;
public void changeAge(Person p)
{
p.age=43;
}
}


结果
first: age of a:32; age of b25(2)
first: age of a:32; age of b43(2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值