基本类型的赋值
基本类型可以直接赋值,内存操作为直接复制一份值给"="前的变量,比如:
int a=13; //输出a,值为13
char 字符变量1 = 'c'; //输出字符变量1,值为c
char 字符变量2 =字符变量1; //输出字符变量2,值为c
/* 已经将值复制走,所以修改字符变量1,不会对 字符变量2 产生影响 */
字符变量1 ='x'; //输出 字符变量1 ,值为x;
//输出 字符变量2 , 值为c;
但是涉及到类与方法时就要注意:
类别名
对一个对象进行操作时,我们实际上操作的是它的引用。所以我们将右边的对象赋予给左边时,赋予的只是该对象的引用。此时,两者指向的堆中的对象还是同一个。
比如我们先创建一个 "人"类
public class person {
public int age;
}
然后尝试改变它
public class MakePeople {
public static void makeSomePeople() {
//腾讯打工仔-马化腾
Person ponyMa = new Person();
//阿里退休员工-马云
Person jackMa = new Person();
ponyMa.age=36;
jackMa.age=66;
// 此时,马化腾36岁,马云66岁
jackMa = ponyMa; //马云 和 马化腾 都指向了同一个 身份证 (内存地址)
// 此时,马化腾36岁,马云36岁
jackMa.age = 27; // 马云 的 身份证 (内存地址) 中的年龄变成了 27岁
System.out.println(ponyMa.age);
// 因为共用一个 身份证 (内存地址), 马化腾的年龄也变成了27岁
}
}
方法别名
下面案例中的方法 f() 似乎会在内部复制其参数 Letter y,但是其实是传递了一个引用。
class Letter {
char c;
}
public class PassObject {
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
System.out.println("x.c: " + x.c); //输出 x.c:a
f(x);
/*调用时实际传递过去的是x变量的地址,
所以修改地址中的值,会造成此处变量的改变*/
System.out.println(" x.c: " + x.c);//输出 x.c:z
}
static void f(Letter y) {
y.c = 'z';
}
}
网友评论