(看这一篇就够了)基本数据类型的赋值与引用类型赋值的区别
總結(jié):
基本類型的變量值小,可直接拷貝;
對象包含多個值,不容易復(fù)制,賦值采用共享同一塊內(nèi)存區(qū)域。
基本類型示例:
public class Test{public static void main(String[] args){int a = 5;//基本數(shù)據(jù)類型的賦值過程就是值拷貝的過程,將5這個值拷貝給aint b = 0;//同理,將0這個值拷貝給ab = a;//執(zhí)行這一步時,將a的值拷貝給了b,b此時的值就是5b = 6;//將6這個值拷貝給了bSystem.out.println("a:" + a);//輸出 a:5System.out.println("b:" + b);//輸出 b:6} }從上面可以看出,修改 a或者b的值時,另一個變量的值不會受到任何影響
引用類型示例:
/*** 實體類(引用類型)*/ public class User{public int age;//int默認(rèn)值為0 } public class Test{public static void main(String[] args){User u1 = new User();//u1的引用指向u1的引用User u2 = new User();//u2的引用指向u2的引用u1.age = 20;u2 = u1;//將u2的引用指向u1的引用,即 u2和u1共享同一個內(nèi)存區(qū)域中的數(shù)據(jù)System.out.println("u1的age:" + u1.age);//輸出 u1的age:20System.out.println("u2的age:" + u2.age);//輸出 u2的age:20u2.age = 30;System.out.println("u1的age:" + u1.age);//輸出 u1的age:30System.out.println("u2的age:" + u2.age);//輸出 u2的age:30} }從上面可以看出,修改 u1.age或者u2.age的值時,另一個變量的值也會一起變化,因為它們所指向的數(shù)據(jù)是同一份數(shù)據(jù)
因為前面講到基本數(shù)據(jù)類型和引用數(shù)據(jù)類型存儲的方式不同(詳見開頭總結(jié)),所以因此在對數(shù)據(jù)進(jìn)行修改時也會有不同
public class Test {public static void main(String[] args) {String name = "張三";int age = 8;String[] su = new String[]{"語文", "數(shù)學(xué)", "英語"};Student stu1 = new Student(age, name, su);/** 測試代碼* int是基本數(shù)據(jù)類型* String是比較特殊的引用數(shù)據(jù)類型* []數(shù)組是引用數(shù)據(jù)類型* */System.out.println("修改前輸出");System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));//直接調(diào)用方法修改數(shù)據(jù)stu1.直接修改基本數(shù)據(jù)類型(age);stu1.直接修改引用數(shù)據(jù)類型(name);stu1.直接修改引用數(shù)據(jù)類型2(su);System.out.println("修改后輸出");System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));System.out.println();System.out.println("修改前輸出");System.out.println(stu1.toString());//傳入引用數(shù)據(jù)類型修改stu1.修改引用數(shù)據(jù)中的基本數(shù)據(jù)類型(stu1);stu1.修改引用數(shù)據(jù)中的引用數(shù)據(jù)類型(stu1);stu1.修改引用數(shù)據(jù)中的引用數(shù)據(jù)類型2(stu1);System.out.println("修改后輸出");System.out.println(stu1.toString());} }class Student {//基本數(shù)據(jù)類型int age;//引用數(shù)據(jù)類型String name;//引用數(shù)據(jù)類型2String[] subject;public Student(){}public Student(int age, String name, String[] subject) {this.age = age;this.name = name;this.subject = subject;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +", subject=" + Arrays.toString(subject) +'}';}public void 直接修改基本數(shù)據(jù)類型(int age) {age++;}public void 直接修改引用數(shù)據(jù)類型(String name) {name += "已修改";}public void 直接修改引用數(shù)據(jù)類型2(String[] su) {su[0] = "已修改";}public void 修改引用數(shù)據(jù)中的基本數(shù)據(jù)類型(Student stu) {stu.age += 2;}public void 修改引用數(shù)據(jù)中的引用數(shù)據(jù)類型(Student stu) {stu.name += "已修改2";}public void 修改引用數(shù)據(jù)中的引用數(shù)據(jù)類型2(Student stu) {stu.subject[0]="已修改";} }?輸出結(jié)果
?總結(jié) :
( 一 ) int作為基本數(shù)據(jù)類型,是直接把一個值傳進(jìn)方法體進(jìn)行修改,
而String雖然是引用數(shù)據(jù)類型,但是因為其特殊性質(zhì),也有int這種基本數(shù)據(jù)類型直接把值拷貝一份傳入的特性,
而 [ ] 數(shù)組作為正常的引用數(shù)據(jù)類型,很明顯就是把存儲值的地址值傳入方法進(jìn)行操作,進(jìn)而在修改后影響了外部的數(shù)據(jù)值
(二) 后用 Student對象 ?存儲基本數(shù)據(jù)類型和特殊的String引用數(shù)據(jù)類型和正常的 [ ] 數(shù)組引用類型,然后進(jìn)行修改其值,可以發(fā)現(xiàn)在外部調(diào)用的值都是修改后的結(jié)果,因為對象也是引用數(shù)據(jù)類型,把存儲值的地址值傳入方法,而方法根據(jù)地址值修改后,在外部調(diào)用的依舊是地址值鏈接的值
?
總結(jié)
以上是生活随笔為你收集整理的(看这一篇就够了)基本数据类型的赋值与引用类型赋值的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: System.arraycopy
- 下一篇: 浏览器卡怎么办_SD卡无法格式化怎么修复