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一個,那麼副本就指向了一個新的地址,此時傳入的引數還是指向原來的地址,所以不會改變引數的值
相關文章
- C++引數的傳遞方式C++
- Mybatis傳遞多個引數的4種方式(乾貨)MyBatis
- JSP向後臺傳遞引數的四種方式JS
- java 中引數的傳遞Java
- GridView傳遞兩個引數的方法View
- 引數傳遞方式必須是const引用傳遞
- C/C++中的引數傳遞方式C++
- 【Practical Java】實踐1:引數以by value方式而非by reference方式傳遞Java
- 使用python指令碼傳遞引數:(三種方式可收藏)Python指令碼
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- require方法接受以下幾種引數的傳遞:UI
- 向路由元件傳遞引數2種方法路由元件
- Java引數傳遞是傳值還是傳引用?Java
- Java中方法引數傳遞詳析Java
- Java方法04:命令列傳遞引數、可變引數Java命令列
- SSM框架中Mybatis傳遞引數的幾種方法SSM框架MyBatis
- JavaScript引數傳遞中值和引用的一種理解JavaScript
- JS的方法引數傳遞(按值傳遞)JS
- Mybatis引數傳遞MyBatis
- JNI傳遞引數
- MyBatis 使用foreach與其他方式的時候引數傳遞方式MyBatis
- 請求引數的傳遞
- 函式的引數傳遞函式
- python中函式引數傳遞的幾種方法Python函式
- Java中的引數傳遞有哪些?通俗易懂Java
- Linux下配置網路引數常用的兩種方式!Linux
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- setTimeout()方法傳遞超過兩個引數介紹
- 引數傳遞中編碼問題(Get/Post 方式)(一)
- 引數傳遞中編碼問題(Get/Post 方式)(二)
- 獲取url傳遞傳遞的某個引數的值
- C#引數傳遞之值引數C#
- OFBiz中的引數傳遞
- Js傳遞陣列引數到後臺controller的方式JS陣列Controller
- 兩種遞迴方式實現迴文字遞迴
- ajax傳遞的引數值包含單引號
- Shell學習【引數傳遞】