賦值使用符號(hào)“=”,可以把“=”右邊的值復(fù)制給左邊。而右邊的值可以是常熟,變量或者表達(dá)式。左邊的變量必須是一個(gè)發(fā)額已命名的變量,也就是說已經(jīng)分配了物理地址的條件下才可以。
但常數(shù)是不可以被賦值的(如4=a是不可以的)。
基本數(shù)據(jù)類型的賦值存儲(chǔ)的是實(shí)際的數(shù)值,是實(shí)際數(shù)值的復(fù)制,修改其中一個(gè),另一個(gè)都不會(huì)改變。
對(duì)象的賦值,則是對(duì)象的引用。如果將一個(gè)對(duì)象賦值給另一個(gè)對(duì)象,則是把一個(gè)地方的引用賦值到另一個(gè)地方。這意味著只要改變其中一個(gè)對(duì)象的引用,那么原來引用的值就會(huì)被覆蓋,而之前引用的值會(huì)被回收掉。
```
class Test{
int test ;
}
public class Main {
public static void main(String[] args) {
? ? ? ? Test test1 =new Test();
Test test2 =new Test();
test1.test =1;
test2.test =2;
System.out.println("1.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
test1 = test2;
System.out.println("2.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
test1.test =3;
System.out.println("3.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
}
}
1.test1.test=1*****test2.test=2
2.test1.test=2*****test2.test=2
3.test1.test=3*****test2.test=3
```
在第三次打印之前我們改變了引用的值,所以我們無法將兩個(gè)對(duì)象的值區(qū)分開來。這樣的問題如何解決呢?
我們來看稍微修改的代碼。
```
class Test{
int test ;
}
public class Main {
public static void main(String[] args) {
Test test1 =new Test();
Test test2 =new Test();
test1.test =1;
test2.test =2;
System.out.println("1.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
test1.test = test2.test;
System.out.println("2.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
test1.test =3;
System.out.println("3.test1.test="+test1.test+"*****"+"test2.test="+test2.test);
}
}
1.test1.test=1*****test2.test=2
2.test1.test=2*****test2.test=2
3.test1.test=3*****test2.test=2
```
我們通過操作對(duì)象內(nèi)部的域來解決這個(gè)問題,但是這樣做頁存在混亂的風(fēng)險(xiǎn),所以要慎用。