溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java按值傳遞和按址傳遞(面試常見(jiàn))

發(fā)布時(shí)間:2020-09-06 11:35:39 來(lái)源:腳本之家 閱讀:120 作者:阿飛-Sunday 欄目:編程語(yǔ)言

先復(fù)制一個(gè)面試/筆試的題:

當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

答案:

是值傳遞。Java語(yǔ)言的方法調(diào)用只支持參數(shù)的值傳遞。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的屬性可以在被調(diào)用過(guò)程中被改變,但對(duì)對(duì)象引用的改變是不會(huì)影響到調(diào)用者的。C++和C#中可以通過(guò)傳引用或傳輸出參數(shù)來(lái)改變傳入的參數(shù)的值。在C#中可以編寫(xiě)如下所示的代碼,但是在Java中卻做不到。

java中的按值傳遞和按址傳遞(按引用傳遞),要明白這兩個(gè)概念,要理解按值和按址。

下面舉個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明:

比如你去國(guó)外旅行,拍了一張?zhí)貏e好的照片,你想分享給你的朋友,那么有兩種方式,第一種是你直接將這個(gè)照片發(fā)送給你的朋友,也就是給你朋友這個(gè)照片的副本;第二種是假如你將這張及其好的照片上傳到一個(gè)QQ(微博)等,你將會(huì)得到一個(gè)訪問(wèn)這個(gè)照片的地址(Url),此時(shí)在將這個(gè)url分享給你的朋友。
如上例子,第一種可以認(rèn)為是按值傳遞,第二種可以認(rèn)為是按址傳遞(按引用傳遞)。知道了這個(gè)概念。在進(jìn)行下面的簡(jiǎn)單分析。

按值傳遞:只有當(dāng)參數(shù)為基本類(lèi)型變量的時(shí)候,java按這種策略的方式傳遞。

上面的分享照片,你的朋友拿到的照片是你的副本,那么朋友對(duì)照片的修改不會(huì)影響你的照片,你對(duì)照片的修改也不會(huì)影響到你給朋友分享的照片。

按址傳遞:只有當(dāng)參數(shù)為引用類(lèi)型變量,java按這種策略方式進(jìn)行傳遞。
上面的Url地址給朋友,那么如果朋友也有修改的權(quán)限,朋友對(duì)照片進(jìn)行操作,自己訪問(wèn)的照片就是朋友操作結(jié)果后的結(jié)果。

下面通過(guò)代碼來(lái)解釋這個(gè)例子:

package com.dufy.reforvalue;
import java.util.Arrays;
/**
 * java中 按值傳遞和按址傳遞
 * 按值傳遞:基本類(lèi)型變量-按值傳遞,按值傳遞通過(guò)復(fù)制獲取參數(shù)的副本
 * 按址傳遞:引用類(lèi)型變量-按址傳遞,按址傳遞通過(guò)傳遞對(duì)象的引用地址
 * 
 * @author dufy
 * @creation 2017年2月9日
 */
public class ReferenceOrValue {
 /**
  * 基本類(lèi)型,按值傳遞
  * 舉例:給朋友分享你的照片,對(duì)方接收的是你的照片的一個(gè)實(shí)際的副本,
  * 你和朋友分別對(duì)各自的照片進(jìn)行操作,不會(huì)影響彼此的照片!
  */
 public static void testVal(int photo){
  photo++;//朋友對(duì)照片進(jìn)行修改
  System.out.println("My friend see photo = " + photo);
 }
 /**
  * 引用類(lèi)型:按址傳遞
  * 舉例:給朋友分享你的照片,分享的是你上傳網(wǎng)上的一個(gè)照片的Url(地址),
  * 你和朋友都可以通過(guò)這個(gè)地址訪問(wèn)照片,并對(duì)照片進(jìn)行一個(gè)操作!
  */
 public static void testRef(Photo photo){
  photo.setPhoto("java Photo,Great!");//朋友對(duì)你的照片進(jìn)行修改
  System.out.println("My friend see photo = " + photo.getPhoto());
 }
 /**
  * 引用類(lèi)型:按址傳遞
  * 因?yàn)閿?shù)組是一個(gè)引用類(lèi)型。所以傳遞進(jìn)去的是它們的引用,故在方法中互換了它們的值,也必然影響到它們?cè)瓉?lái)的值.
  */
 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;//定義要發(fā)送的照片
  testVal(photo);//將照片發(fā)發(fā)送你朋友,朋友得到的是一個(gè)副本
  System.out.println("My see photo = " + photo);
  //二:按址傳遞
  Photo p = new Photo();//定義一個(gè)照片的對(duì)象,我自己拍攝的java photo
  p.setPhoto("java photo");
  testRef(p);//將照片對(duì)象(即 Url地址) 發(fā)送你朋友,朋友得打的是一個(gè)Url(地址),Url打開(kāi)才是照片
  System.out.println("My friend see photo = " + p.getPhoto());
  //三:數(shù)組也是對(duì)象,數(shù)組在堆內(nèi)存。引用是在棧。
  int array[] = {1,2,3,4,5};
  testArrayRef(array);
  System.out.println("array is = "+Arrays.toString(array));
 }
 /**
  * 照片類(lèi)
  */
 static class Photo{
  String photo;
  public String getPhoto() {
   return photo;
  }
  public void setPhoto(String photo) {
   this.photo = photo;
  }
 }
}

輸出的結(jié)果如下:

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]

小插曲:有下下面這一道題:這個(gè)method應(yīng)該怎么寫(xiě)呢?

public static void main(String[] args) {
  int a = 10;
  int b = 20;
  method(a,b);//需要在method被調(diào)用后,僅打印出a=100,b=200,請(qǐng)寫(xiě)出method(a,b)方法!
  System.out.println("a = " + a);
  System.out.println("b = " + b);
 }

肯定有很多人和我之前一樣,想都沒(méi)想就寫(xiě)出下面的代碼:

private static void method(int a, int b) {
  a*=10;
  b*=10;
 }

但是運(yùn)行結(jié)果后你會(huì)發(fā)現(xiàn),沒(méi)有打印出理想的結(jié)果!

這時(shí)候如果你仔細(xì)看來(lái)了上面的介紹就不難理解為什么會(huì)出現(xiàn)這樣的結(jié)果了!

給出這道題可能正確的結(jié)果:

private static void method(int a, int b) {
  System.out.println("a=100,b=200");
  System.exit(0);
 }

以上所述是小編給大家介紹的Java按值傳遞和按址傳遞(面試常見(jiàn)),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI