使用一个引用数据类型的变量赋值给另一个引用数据类型的变量时会使两个变量保存同一块堆区域的地址值,修改其中任何一个变量相应的另一个变量也会进行相应的改变,因为二者指向的是一个数据。例如:
public class ObjectTest {
public static void main(String[] args) {
Student s1 = new Student();
s1.age = 14;
s1.name = "Synhard";
Student s2 = new Student();
s2 = s1;
System.out.println("name:" + s2.name + ", age:" + s2.age);
s1.name = "Bob";
System.out.println("name:" + s2.name + ", age:" + s2.age);
}
}
class Student {
int age;
String name;
}
在第一次输出s2的属性值时由于s2和s1指向堆区域的同一个数据,因此输出的值与s1相同,这时再将s1的name属性修改为‘Bob’相应的s2的name属性也会修改
但对于引用类型String来说这样是修改是无效的,因为String使用了关键字final做修饰,一旦定义便无法被修改,只能被重新赋值。比如以下代码:
public class ObjectTest {
public static void main(String[] args) {
String a="a";
String b=a;
b="b";
System.out.println(a);//output:a
}
}
b一开始和a指向堆区域的同一个数据,故输出二者的值是相等的。但是修改b的值,不会令a的值修改,此时输出a的值还是原来的'a',因为String是final类型的数据,一旦声明便无法被修改,只能重新赋值。
网友评论