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