Java里方法的參數傳遞方式只有一種:值傳遞。
Java中參數傳遞的都是參數值
下面從兩個維度來看
1、傳遞的參數是8種基本數據類型
這個比較好理解,8種基本數據類型,作為參數時,可以理解為原來的一個副本,作為方法內的局部變量,存儲在方法棧中。
副本值的改變,對原始值無任何影響。
2、傳遞的參數是對象引用類型
很多人可能有一個誤解,認為java中對象作為參數時,傳遞的是引用,其實不然。
在java中的設計模型中,一個對象可以拆分成兩部分,一個是指向對象的變量名,一般存儲在棧中,
一個是真正的對象內容,存儲在堆中。
具體模型如下圖:
所以對象作為參數時,傳遞的也是值,只不過這個值有點特殊,是對象的引用地址,即棧內存里面的變量所指向的地址值
附 代碼demo
/** * 描述 : 測試java中數據的傳遞 * * * @Author : zhanghao * @Time : 2019/12/19 18:31 */ public class Test { public static void main(String[] args) { Test test=new Test(); //1、測試基本數據類型 int basicVal=1; System.out.println("參數前 basicVal:"+basicVal); test.basicDataTypeParam(basicVal); System.out.println("參數后 basicVal:"+basicVal); //2、測試引用類型參數 Student stu=new Student("張三"); System.out.println("參數前 stu.name:"+stu.getName()); test.referDataTypeParam(stu); System.out.println("參數后 stu.name:"+stu.getName()); //3、測試引用數組 Integer[] arrInt=new Integer[10]; arrInt[0]=123; System.out.println("參數前 arrInt.length:"+arrInt.length); System.out.println("參數前 arrInt[0]:"+arrInt[0]); test.referArrayParam(arrInt); System.out.println("參數后 arrInt.length:"+arrInt.length); System.out.println("參數后 arrInt[0]:"+arrInt[0]); //4、其它常用引用類型 如字符串 String String strVal="2008年,北京歡迎你"; System.out.println("參數前 strVal:"+strVal); test.referStrParam(strVal); System.out.println("參數后 strVal:"+strVal); } /** * 測試字符串引用類型 * * * @param strVal */ private void referStrParam(String strVal) { strVal="2020年,北京歡迎你"; } /** * 測試引用數組 同時改變參數值,並為參數重新賦值 * * @param arrInt */ private void referArrayParam(Integer[] arrInt) { arrInt[0]=456; arrInt=new Integer[20]; } /** * 測試引用數據類型 * * @param stu */ private void referDataTypeParam(Student stu) { stu.setName("李四"); } /** * 測試基本數據類型參數 * * @param basicVal */ private void basicDataTypeParam(int basicVal) { basicVal=2; }
/** * 描述 : 學生類實體 * * @Author : zhanghao * @Time : 2019/12/21 19:22 */ public class Student { String name; public Student(String name){ this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }