首页 > 编程 > Java > 正文

java学习——java按值传递和按址传递

2019-11-09 19:11:15
字体:
来源:转载
供稿:网友

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 = 11My see photo = 10My 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]

java到底是值传递还是引用传递? 知乎:https://www.zhihu.com/question/31203609


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表