java 傳遞引數的兩種方式
java 傳遞引數的兩種方式
Java中沒有指標,所以也沒有引用傳遞了,僅僅有值傳遞不過可以通過物件的方式來實現引用傳遞 類似java沒有多繼承 但可以用多次implements 介面實現多繼承的功能
值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。
引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,方法執行中形式引數值的改變將會影響實際引數的值。
a.傳遞值的資料型別:八種基本資料型別和String(這樣理解可以,但是事實上String也是傳遞的地址,只是string物件和其他物件是不同的,string物件是不能被改變的,內容改變就會產生新物件。那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的記憶體地址)。
b.傳遞地址值的資料型別:除String以外的所有複合資料型別,包括陣列、類和介面
值傳遞的例子:
- package com.other.test;
- public class Test {
- public static void change(int i, int j) {
- int temp = i;
- i = j;
- j = temp;
- }
- public static void main(String[] args) {
- int a = 3;
- int b = 4;
- change(a, b);
- System.out.println("a=" + a);
- System.out.println("b=" + b);
- }
- }
輸出的結果是 a=3 b=4,傳遞的值並不會改變原值
引用傳遞的例子:(陣列)
- package com.other.test;
- public class Test {
- public static void change(int[] counts) {
- counts[0] = 6;
- System.out.println(counts[0]);
- }
- public static void main(String[] args) {
- int[] count = { 1, 2, 3, 4, 5 };
- change(count);
- System.out.println(count[0]);
- }
- }
輸出結果是6 6 也就是引用的值改變了原來的值
引用傳遞的例子:(物件)
定義一個A物件:
- package com.other.test;
- public class A {
- int i = 0;
- }
對上邊物件操作的類:
- package com.other.test;
- public class Test {
- public static void add(A a) {
- //a = new A(); ①
- a.i++;
- }
- public static void main(String args[]) {
- A a = new A();
- add(a);
- System.out.println(a.i );
- }
- }
當把①註解掉時,輸出的結果是1,當①沒有註解是是0,原因是 a =new A();構造了新的A物件就不是傳遞的那個物件了。
看看String的情況:
- package com.other.test;
- public class Test {
- String str = new String("old");
- char[] ch = { 'a', 'b', 'c' };
- public static void main(String args[]) {
- Test ex = new Test();
- ex.change(ex.str, ex.ch);
- System.out.print(ex.str + " and ");
- System.out.println(ex.ch);
- }
- public void change(String str, char ch[]) {
- str = "new";
- ch[0] = 'd';
- }
- }
輸出的結果的是 old and dbc也就是傳遞String並不會改變原值,而是建立了一個新值。 ch[]就是一個簡單的陣列的傳遞。
( 物件包括物件引用即地址和物件的內容)
對於物件型別,也就是Object的子類,如果你在方法中修改了它的成員的值,那個修改是生效的,方法呼叫結束後,它的成員是新的值,但是如果你把它指向一個其它的物件,方法呼叫結束後,原來對它的引用並沒用指向新的物件。
Java引數,不管是原始型別還是引用型別,傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。
如果引數型別是原始型別,那麼傳過來的就是這個引數的一個副本,也就是這個原始引數的值,這個跟之前所談的傳值是一樣的。如果在函式中改變了副本的值不會改變原始的值.
如果引數型別是引用型別,那麼傳過來的就是這個引用引數的副本,這個副本存放的是引數的地址。如果在函式中沒有改變這個副本的地址,而是改變了地址中的值,那麼在函式內的改變會影響到傳入的引數。如果在函式中改變了副本的地址,如new一個,那麼副本就指向了一個新的地址,此時傳入的引數還是指向原來的地址,所以不會改變引數的值
相關文章
- Java中將方法作為引數傳遞5種方式Java
- C++引數的傳遞方式C++
- GridView傳遞兩個引數的方法View
- 引數傳遞方式必須是const引用傳遞
- 使用python指令碼傳遞引數:(三種方式可收藏)Python指令碼
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- JAVA基礎之-引數傳遞Java
- 引數傳遞
- 向路由元件傳遞引數2種方法路由元件
- Java方法04:命令列傳遞引數、可變引數Java命令列
- SSM框架中Mybatis傳遞引數的幾種方法SSM框架MyBatis
- JS的方法引數傳遞(按值傳遞)JS
- Js傳遞陣列引數到後臺controller的方式JS陣列Controller
- Linux下配置網路引數常用的兩種方式!Linux
- 引數的定義和引數的傳遞
- Mybatis引數傳遞MyBatis
- 請求引數的傳遞
- 函式的引數傳遞函式
- SpringBoot系列Mybatis之引數傳遞的幾種姿勢Spring BootMyBatis
- Java中的引數傳遞有哪些?通俗易懂Java
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- 兩種go傳送郵件的方式Go
- Python的函式引數傳遞:傳值?引用?Python函式
- Shell學習【引數傳遞】
- linux中main引數傳遞LinuxAI
- 利用閉包傳遞引數
- JavaScript函式傳遞引數JavaScript函式
- out,ref,params引數傳遞
- t-on-click 傳遞引數
- python中函式的引數傳遞Python函式
- restful介面Map接收引數的兩種方式(x-www-form-urlencoded方式和JSON)RESTORMJSON
- php函式之如何用預設引數和可變長度引數方式傳遞?PHP函式
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- vue兩個元件間值的傳遞或修改方式Vue元件
- Java入門第12天 (方法過載 ,方法的引數傳遞)Java
- Java後臺接收前端傳遞的陣列物件引數的處理Java前端陣列物件
- 函式作為引數傳遞函式