基本类型赋值和普通对象赋值的不同
?對象賦值是Reference(參考)賦值,而基本類型是直接值得拷貝。
package qwer;public class asdf {public static void main(String[] args) {class MyNumber{int num=5;}int num1=5;int num2=num1;System.out.println("num1:" + num1 + ", num2:" + num2);num2=10;System.out.println("num1:" + num1 + ", num2:" + num2);MyNumber obj1=new MyNumber();MyNumber obj2=new MyNumber();System.out.println(obj1.num);System.out.println(obj2.num);System.out.println("======接下來輸出新值=====");obj2=obj1;obj2.num=10;System.out.println(obj1.num);System.out.println(obj2.num);}}先對num1賦值為5,然后賦值num2等于num1,這時候num2等于5,當(dāng)num2賦值為10時,第二個輸出num2為10,那num1為5。
因為num2等于num1時,num2指向一個5,num1另指向一個5,相當(dāng)于拷貝過程,所以num2為10,num1為5.
定義了一個obj1和一個obj2,obj1指向一個5,obj2指向另一個5,obj1的指向賦給obj2,相當(dāng)于obj2的指針指向的是和obj1的同一個地方,而之前obj2指向的那個5就沒有指針指向了,當(dāng)obj2賦值為10的時候,發(fā)現(xiàn)obj1賦值也為10了。
package qwer; public class zxcv {public static void main(String[] args) {class MyNumber{int num=5;}int a=1,b=2;swap(a,b);System.out.println("a is :" + a + ", b is :" + b);MyNumber obj1=new MyNumber();MyNumber obj2=new MyNumber();obj2.num=10;swap(obj1,obj2);System.out.println("obj1 is :" + obj1.num + ", obj2 is :" + obj2.num);}public static void swap(int m,int n){int s=m;m=n;n=s;}public static void swap(MyNumber obj3,MyNumber obj4){int s=obj3.num;obj3.num=obj4.num;obj4.num=s;} }第一個交換程序:沒有達(dá)到效果,因為swap函數(shù)的形參是int型,int型是直接賦值的,相當(dāng)于a=1,b=2,m=1,n=2,函數(shù)運行后a=1,b=2,m=2,n=1,只是m,n的值相互換了,但是a,b的值沒有改。
第二個交換程序:達(dá)到了效果。因為對象是比較龐大的,賦值是直接賦指針的,傳過去的就是obj1=obj3,obj2=obj4,即obj1和obj3指向同一塊內(nèi)存,obj2和obj4指向同一個內(nèi)存,這樣最后的值就交換了。
總結(jié):基本類型的變量值小,可直接拷貝;對象包含多個值,不容易復(fù)制,賦值采用共享同一塊內(nèi)存區(qū)域,即指針指向同一內(nèi)存區(qū)域,函數(shù)里的局部變量編譯器不會給默認(rèn)值,需要自己初始化,不然會報錯,類的成員變量,編譯器會給默認(rèn)值,可以直接使用。
總結(jié)
以上是生活随笔為你收集整理的基本类型赋值和普通对象赋值的不同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kernel_mktime() 详解 —
- 下一篇: 故障解决:error while loa