int屬於基本數據類型,因此在方法中進行傳遞和引用時,並不會改變該變量的數值
而arr屬於數組,是引用數據類型,因此在方法引用時,實際傳遞的是該數組在堆內存中的物理內存地址,在方法中對該數組進行操作,則會影響到該數組內部的數值,會發生改變.
在java中,基本數據類型作爲參數傳遞的時候叫做值傳遞,傳的是值本身,
值傳遞:值在該方法中改變屬於局部變量改變
當出了該方法就沒有作用了(方法中的傳遞的基本數據類型就屬於局部變量)
在 Java 中,凡是可以指向一個對象或包含一個值的標識符,都可以稱爲變量。
變量的內容,有可能是一個值,也有可能是指向一個對象的引用。
String /基本數據類型包裝類,雖然都是引用數據類型,但是在發生傳參的時候,它們傳的是值
public class TestReference {
public static void main(String[] args) {
//Integer i = new Integer(5);
//System.out.println(i.hashCode());
//int j = 5;
//System.out.println(j.hashCode());
//不能對基本類型調用方法,但可以對引用類型調用方法:
/*
Integer a = 120;
int b= 120;
Integer c = 120;
Integer d = new Integer(120);
System.out.println(a == b); //產生的原因是編譯器編譯時會調用intValue()自動的將a進行了拆箱,結果肯定是true;
System.out.println(a == c); //true jdk對-128~127之間的值做了緩存。
System.out.println(a == d); //false new Integer(120)構造器會創建新的對象。
Integer e = 128;
Integer f = 128;
System.out.println(e == f); //false 大於128 使用==比較,不相等。
*/
/*
int n=3;
int m=3;
System.out.println(n==m); //直接比較值
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2); //兩個對象
str1 = str;
str2 = str;
System.out.println(str1==str2); //指向了同一個引用
*/
/*
boolean b = false; //值傳遞
Boolean boo = new Boolean(false);//包裝類因爲會自動裝箱拆箱,所以可以和基本類型一樣處理,所以示例中boo的值就是false;
Boolean[] arr = new Boolean[]{false}; // 數組是引用類型,所以arr的值就是指向該Boolean[]的引用。
//java中只有值傳遞沒有引用傳遞,所以傳入getMiddleOne方法的三個參數分別是b的值拷貝, boo的值拷貝, arr的值拷貝。
//java中只有值傳遞,基本類型傳遞的是值的副本,引用類型傳遞的是引用的副本。
getMiddleOne(b, boo, arr);
System.out.println(b);
System.out.println(boo.toString());
System.out.println(arr[0]); //arr的值就是指向該Boolean[]的引用。
*/
}
private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr) {
b = true;
boo = new Boolean(true);
arr[0] = true;
}
}
https://blog.csdn.net/weixin_42386014/article/details/81121620
https://blog.csdn.net/YidingHe/article/details/4205617