Java按值传递和按址传递(面试常见)

  

先复制一个面试/笔试的题:

  

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递吗?

  

  

是值传递. Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的C + +和c#中可以通过传引用或传输出参数来改变传入的参数的值。在c#中可以编写如下所示的代码,但是在Java中却做不到。

  

java中的按值传递和按址传递(按引用传递),要明白这两个概念,要理解按值和按址。

  

下面举个简单的例子来说明:

  

比如你去国外旅行,拍了一张特别好的照片,你想分享给你的朋友,那么有两种方式,第一种是你直接将这个照片发送给你的朋友,也就是给你朋友这个照片的副本;第二种是假如你将这张及其好的照片上传到一个QQ(微博)等,你将会得到一个访问这个照片的地址(Url),此时在将这个Url分享给你的朋友。
  如上例子,第一种可以认为是按值传递,第二种可以认为是按址传递(按引用传递)。知道了这个概念。在进行下面的简单分析。

  

<强> 只有当参数为基本类型变量的时候,java按这种策略的方式传递。

  

上面的分享照片,你的朋友拿到的照片是你的副本,那么朋友对照片的修改不会影响你的照片,你对照片的修改也不会影响到你给朋友分享的照片。

  

只有当参数为引用类型变量,java按这种策略方式进行传递。
  上面的Url地址给朋友,那么如果朋友也有修改的权限,朋友对照片进行操作,自己访问的照片就是朋友操作结果后的结果。

  

下面通过代码来解释这个例子:

        包com.dufy.reforvalue;   进口java.util.Arrays;/* *   * java中按值传递和按址传递   *按值传递:基本类型变量,按值传递,按值传递通过复制获取参数的副本   *按址传递:引用类型变量——按址传递,按址传递通过传递对象的引用地址   *   * @author dufy   * @creation 2017年2月9日   */公开课ReferenceOrValue {/* *   *基本类型,按值传递   *举例:给朋友分享你的照片,对方接收的是你的照片的一个实际的副本,   *你和朋友分别对各自的照片进行操作,不会影响彼此的照片!   */公共静态孔隙testVal (int图){   照片+ +,//朋友对照片进行修改   system . out。println(“我的朋友见图=" +照片);   }/* *   *引用类型:按址传递   *举例:给朋友分享你的照片,分享的是你上传网上的一个照片的Url(地址),   *你和朋友都可以通过这个地址访问照片,并对照片进行一个操作!   */公共静态孔隙testRef(照片图){   照片。setPhoto (“java的照片,太棒了!”);//朋友对你的照片进行修改   system . out。println(“我的朋友见图=" + photo.getPhoto ());   }/* *   *引用类型:按址传递   *因为数组是一个引用类型,所以传递进去的是它们的引用,故在方法中互换了它们的值,也必然影响到它们原来的值。   */公共静态孔隙testArrayRef (int[]数组){   for (int i=0;我& lt;array.length;我+ +){   array[我]=0;   }   system . out。println (" testArrayRef数组=" + Arrays.toString(数组));   }   公共静态void main (String [] args) {//一:按值传递   int照片=10;//定义要发送的照片   testVal(图);//将照片发发送你朋友,朋友得到的是一个副本   system . out。println(“我的见图=" +照片);//二:按址传递   照片p=新照片();//定义一个照片的对象,我自己拍摄的java照片   p。setPhoto (“java”照片);   testRef (p);//将照片对象(即Url地址)发送你朋友,朋友得打的是一个Url(地址),网址打开才是照片   system . out。println(“我的朋友见图=" + p.getPhoto ());//三:数组也是对象、数组在堆内存。引用是在栈。   int[]数组={1,2,3,4,5};   testArrayRef(数组);   system . out。println("数组=" + Arrays.toString(数组));   }/* *   *照片类   */静态类图{   字符串的照片;   公共字符串getPhoto () {   返回图片;   }   公共空间setPhoto(弦图){   这一点。照片=照片;   }   }   }      

输出的结果如下:

  

我的朋友见图11=
  我看到的照片=10
  我的朋友照片见图=java,太棒了!

Java按值传递和按址传递(面试常见)