Java傳參傳值
Java 傳參傳值
案例程式碼
public class PassParamExplain {
public static void main(String[] args) {
//example A
System.out.println("example A:");
Integer a = 2018;
passInteger(a);
System.out.println(a);
a = passInteger(a);
System.out.println(a);
//example B
System.out.println("example B:");
Pojo pojo1 = new Pojo(2021, "2021");
passPojo(pojo1);
System.out.println("pojo1 x:" + pojo1.getX() + " y:" + pojo1.getY());
//example C
System.out.println("example C:");
Pojo pojo2 = new Pojo(2022, "2022");
pojo2 = passPojo(pojo2);
System.out.println("pojo2 x:" + pojo2.getX() + " y:" + pojo2.getY());
//example D
System.out.println("example D:");
Pojo pojo3 = new Pojo(2023, "2024");
passPojoAndReassign(pojo3);
System.out.println("a: pojo3 x:" + pojo3.getX() + " y:" + pojo3.getY());
pojo3 = passPojoAndReassign(pojo3);
System.out.println("b: pojo3 x:" + pojo3.getX() + " y:" + pojo3.getY());
}
public static Integer passInteger(Integer arg) {
arg = 2019;
return arg;
}
public static Pojo passPojo(Pojo pojoA) {
pojoA.setX(2019);
pojoA.setY("2019");
return pojoA;
}
public static Pojo passPojoAndReassign(Pojo pojoB) {
pojoB = new Pojo(2020, "2020");
return pojoB;
}
}
public class Pojo {
private Integer x;
private String y;
public Pojo(Integer x, String y) {
this.x = x;
this.y = y;
}
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
}
案例分析
-
example A
- 呼叫passInteger(a)時,產生了一個新的區域性變數arg,並且變數arg被賦值為a存放的引用,緊接著執行方法passInteger內的賦值語句 arg = 2019,此時區域性變數arg被重新賦值為一個新的引用;
- 只執行passInteger(a)並不會修改main方法變數a的值(即變數a存放的引用),因為passInteger方法只對區域性變數arg重新賦值並返回,呼叫passInteger(a)方法時僅僅是把變數a存放的引用傳給了變數arg
- 執行 a = passInteger(a)時; 因為passInteger方法返回了一個新的引用(且每次呼叫都返回一個新引用,因為 arg = 2019 語句產生了新的物件), 並且賦值給了變數a,因此main方法變數a當然是改變了
-
example B
- 呼叫passPojo(pojo1)時,產生了一個新的區域性變數pojoA,並且變數pojoA被賦值為引數pojo1的值(即pojo1存放的引用),此時變數pojoA的值為變數pojo1存放的引用(該引用指向pojo1物件的記憶體空間),兩個變數存放的引用是相同的;
- 執行pojoA.setX(2019); pojoA.setY(“2019”); 修改了該引用指向的記憶體空間的資料,因此即使僅僅呼叫passPojo(pojo1),變數pojo1指向的記憶體空間的資料也會相應得到改變
-
example C
- pojo2 = passPojo(pojo2);與passPojo(pojo2);的區別是前者接收了方法passPojo返回的引用,並賦值給了變數pojo2;但根據example B的分析可得,呼叫passPojo(pojo2)返回的引用其實和呼叫之前pojo2存放的引用是指向同一個空間的引用,
- 只是變數pojoA存放的是變數pojo2指向的記憶體空間引用的副本而已;
-
example D
- example D和example A本質其實是相同的,
- passPojoAndReassign(pojo3)時,產生了一個新的區域性變數pojoB,並且變數pojoB被賦值為pojo3存放的引用,緊接著執行方法內語句pojoB = new Pojo(2020, “2020”); 此時區域性變數pojoB被重新賦值為一個新的引用,該新引用指向new Pojo(2020, “2020”)物件存放的記憶體空間;只修改了變數pojoB存放的引用,變數pojo3沒有任何修改;
- 只執行passPojoAndReassign(pojo3),由於變數pojo3沒有接收passPojoAndReassign方法的返回值所以並不會修改main方法變數pojo3存放的引用,而且passPojoAndReassign方法內也沒有修改變數pojo3存放的引用指向的記憶體空間的資料,因此變數pojo3沒有任何改變;
- pojo3 = passPojoAndReassign(pojo3);與passPojoAndReassign(pojo3)的唯一的不同點是前者用變數pojo3接收了passPojoAndReassign方法返回的新的引用,且每次呼叫passPojoAndReassign方法都返回一個新引用,因此main方法中變數pojo3存放的引用被改變了
案例資料變化列印輸出
example A:
2018
2019
example B:
pojo1 x:2019 y:2019
example C:
pojo2 x:2019 y:2019
example D:
a: pojo3 x:2023 y:2024
b: pojo3 x:2020 y:2020
相關文章
- JAVA值傳參和引用傳參Java
- Vue 路由傳值(傳參)詳解Vue路由
- java值傳遞Java
- Java只有值傳遞Java
- Java 是傳值還是傳引用 (轉)Java
- Java的值傳遞和引用傳遞Java
- Java引數傳遞是傳值還是傳引用?Java
- Java - 是值傳遞還是引用傳遞Java
- Java中的值傳遞和引用傳遞Java
- react中路由傳參和url傳參React路由
- java靈活傳參之builder模式JavaUI模式
- Js呼叫Java方法並互相傳參JSJava
- 解惑4:java是值傳遞還是引用傳遞Java
- java方法中只有值傳遞,沒有引用傳遞Java
- java經典問題:傳值還是傳引用(轉)Java
- React中this值繫結和事件函式傳參React事件函式
- IOS學習筆記(頁面傳值:屬性傳值,協議代理傳值,閉包傳值)iOS筆記協議
- Java方法04:擴充命令列傳參Java命令列
- iOS Block傳值、代理傳值、通知中心iOSBloC
- vue父子傳值與非父子傳值Vue
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- angular路由傳參Angular路由
- 【SpringMVC】傳參SpringMVC
- [SpringMVC] 傳參SpringMVC
- SCSS @mixin傳參CSS
- Vue路由傳參Vue路由
- angular 路由傳參Angular路由
- java中傳值方式的個人理解Java
- Java學習之值傳遞(轉)Java
- 你真的理解Python中的賦值、傳參嗎?Python賦值
- 元件:非父子間傳值(同級傳值)元件
- iOS傳值iOS
- 值傳遞與引用傳遞
- 值傳遞和引用傳遞
- Vue--子元件互相傳值,子元件來回傳值,傳值反覆橫跳Vue元件
- vue傳參之通過Vue屬性$route的params傳參Vue
- java 獲取傳入值的區間Java
- 網頁地址傳參網頁