您好,登錄后才能下訂單哦!
先復制一個面試/筆試的題:
當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
答案:
是值傳遞。Java語言的方法調用只支持參數的值傳遞。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用過程中被改變,但對對象引用的改變是不會影響到調用者的。C++和C#中可以通過傳引用或傳輸出參數來改變傳入的參數的值。在C#中可以編寫如下所示的代碼,但是在Java中卻做不到。
java中的按值傳遞和按址傳遞(按引用傳遞),要明白這兩個概念,要理解按值和按址。
下面舉個簡單的例子來說明:
比如你去國外旅行,拍了一張特別好的照片,你想分享給你的朋友,那么有兩種方式,第一種是你直接將這個照片發送給你的朋友,也就是給你朋友這個照片的副本;第二種是假如你將這張及其好的照片上傳到一個QQ(微博)等,你將會得到一個訪問這個照片的地址(Url),此時在將這個url分享給你的朋友。
如上例子,第一種可以認為是按值傳遞,第二種可以認為是按址傳遞(按引用傳遞)。知道了這個概念。在進行下面的簡單分析。
按值傳遞:只有當參數為基本類型變量的時候,java按這種策略的方式傳遞。
上面的分享照片,你的朋友拿到的照片是你的副本,那么朋友對照片的修改不會影響你的照片,你對照片的修改也不會影響到你給朋友分享的照片。
按址傳遞:只有當參數為引用類型變量,java按這種策略方式進行傳遞。
上面的Url地址給朋友,那么如果朋友也有修改的權限,朋友對照片進行操作,自己訪問的照片就是朋友操作結果后的結果。
下面通過代碼來解釋這個例子:
package com.dufy.reforvalue; import java.util.Arrays; /** * java中 按值傳遞和按址傳遞 * 按值傳遞:基本類型變量-按值傳遞,按值傳遞通過復制獲取參數的副本 * 按址傳遞:引用類型變量-按址傳遞,按址傳遞通過傳遞對象的引用地址 * * @author dufy * @creation 2017年2月9日 */ public class ReferenceOrValue { /** * 基本類型,按值傳遞 * 舉例:給朋友分享你的照片,對方接收的是你的照片的一個實際的副本, * 你和朋友分別對各自的照片進行操作,不會影響彼此的照片! */ public static void testVal(int photo){ photo++;//朋友對照片進行修改 System.out.println("My friend see photo = " + photo); } /** * 引用類型:按址傳遞 * 舉例:給朋友分享你的照片,分享的是你上傳網上的一個照片的Url(地址), * 你和朋友都可以通過這個地址訪問照片,并對照片進行一個操作! */ public static void testRef(Photo photo){ photo.setPhoto("java Photo,Great!");//朋友對你的照片進行修改 System.out.println("My friend see photo = " + photo.getPhoto()); } /** * 引用類型:按址傳遞 * 因為數組是一個引用類型。所以傳遞進去的是它們的引用,故在方法中互換了它們的值,也必然影響到它們原來的值. */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("testArrayRef array is = "+Arrays.toString(array)); } public static void main(String[] args) { //一:按值傳遞 int photo = 10;//定義要發送的照片 testVal(photo);//將照片發發送你朋友,朋友得到的是一個副本 System.out.println("My see photo = " + photo); //二:按址傳遞 Photo p = new Photo();//定義一個照片的對象,我自己拍攝的java photo p.setPhoto("java photo"); testRef(p);//將照片對象(即 Url地址) 發送你朋友,朋友得打的是一個Url(地址),Url打開才是照片 System.out.println("My friend see photo = " + p.getPhoto()); //三:數組也是對象,數組在堆內存。引用是在棧。 int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("array is = "+Arrays.toString(array)); } /** * 照片類 */ static class Photo{ String photo; public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } } }
輸出的結果如下:
My friend see photo = 11
My see photo = 10
My friend see photo = java Photo,Great!
My friend see photo = java Photo,Great!
testArrayRef array is = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]
小插曲:有下下面這一道題:這個method應該怎么寫呢?
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);//需要在method被調用后,僅打印出a=100,b=200,請寫出method(a,b)方法! System.out.println("a = " + a); System.out.println("b = " + b); }
肯定有很多人和我之前一樣,想都沒想就寫出下面的代碼:
private static void method(int a, int b) { a*=10; b*=10; }
但是運行結果后你會發現,沒有打印出理想的結果!
這時候如果你仔細看來了上面的介紹就不難理解為什么會出現這樣的結果了!
給出這道題可能正確的結果:
private static void method(int a, int b) { System.out.println("a=100,b=200"); System.exit(0); }
以上所述是小編給大家介紹的Java按值傳遞和按址傳遞(面試常見),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。