先复制一个面试/笔试的题:
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递吗?
是值传递. 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,太棒了!