Java中引用类型的参数也是值传递

Java 值传递详解 很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。引用传递看似很好,能在方法内就直接把实参的值修改了,但是,为什么 Java 不引入引用传递呢?为了更强有力地反驳 Java 对引用类型的参数采用的不是引用传递,我们再来看下面这个案例!实际上,并不是的,这里传递的还是值,不过,这个值是实参的地址罢了!的副本,副本的内容无论怎么修改,都不会影响到原件本身。的互换只是拷贝的两个地址的互换罢了,并不会影响到实参。(实参)的地址,因此,它和。 阅读详情

简述

调用方法的时候,有需要传参数的情况。在Java中,参数的类型有基本类型和引用类型两种。

一开始听到一个说法,Java没有引用传递,但是一直没有太多的思考在上面,直到前不久玩数组的时候,突然间发现把数组引用变量作为参数传递到一个方法当中进行操作之后,再去访问原数组,原数组元素的值竟然改变了。于是乎,就想到了之前在C++里面学过的引用传递,突然有一种错愕的感觉,就查了一些资料,探究当Java将引用类型变量作为参数传递给方法的时候,到底是值传递还是引用传递。

结论:如果将Java引用类型变量作为参数传递给方法,是将引用变量的值传递给形参,而引用变量的值实际上就是引用对象在堆内存中的地址。也就是说,这个时候实参和形参指向了同一个对象,如果利用形参进行操作,操作的就是实参指向的对象,最后通过实参的那个引用访问,自然是被形参操作过的结果。


 基本类型参数

基本类型参数是典型的值传递,著名的案例就是更换两个数的值。下面是这个问题的示例代码:

public class Main {
	public static void main(String[] args) {
		int num1 = 11;
		int num2 = 22;
		System.out.println("Before the call: num1 is " + num1 + " and num2 is " + num2);
		swap(num1, num2);
		System.out.println("After the call: num1 is " + num1 + " and num2 is " + num2);
	}
	
	public static void swap(int num1, int num2) {
		System.out.println("num1 is " + num1 + " and num2 is " + num2 + " in method of swap.(before)");
		int tmp = num1;
		num1 = num2;
		num2 = tmp;
		System.out.println("num1 is " + num1 + " and num2 is " + num2 + " in method of swap.(after)");
	}
}

运行结果如下:

Before the call: num1 is 11 and num2 is 22
num1 is 11 and num2 is 22 in method of swap.(before)
num1 is 22 and num2 is 11 in method of swap.(after)
After the call: num1 is 11 and num2 is 22

通过运行结果,可以清楚地知道,通过这样的参数传递,交换的仅仅是形参的值,而main方法当中的两个数的值并没有发生变化。这就是值传递的结果。(具体如何通过方法交换基本类型的变量的值,可以参看笔者的另一篇博客:如何通过方法实现基本类型的数值交换。)

引用类型参数

通过一个数组引用演示引用类型参数的传递效果

public class ArrayTest {
	public static void main(String[] args) {
		int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		System.out.print("Before calling the inversion: ");
		for (int i : arr) {
			System.out.printf("%3d", i);
		}
		System.out.println();
		inversion(arr);
		System.out.print(" After calling the inversion: ");
		for (int i : arr) {
			System.out.printf("%3d", i);
		}
		System.out.println();
		
		setNull(arr);
		System.out.println("@" + arr);
	}
	public static void inversion(int[] arr) {
		int length = arr.length;
		for (int i = 0; i <= length / 2; i++) {
			int temp = arr[i];
			arr[i] = arr[length - i - 1];
			arr[length - i -1] = temp;
		}
	}
	
	public static void setNull(int[] array) {
		System.out.println("#" + array);
		array = null;
		System.out.println("$" + array);
	}
}

程序运行结果:

Before calling the inversion:   0  1  2  3  4  5  6  7  8  9
   After calling the inversion:   9  8  7  6  4  5  3  2  1  0
#[I@1d251891
$null
@[I@1d251891 

 程序中,在main方法中定义了一个数组,并且在类中定义了一个将数组元素倒置的方法inversion(),这个方法需要传入一个数组类型的引用。在main方法中调用这个方法,并将arr这个数组的引用作为参数传递给inversion方法,通过程序执行的结果,可以看到当inversion方法执行完毕,main方法中的arr数组的内容的确发生了倒置。

那么,这个时候是否就可以认为,引用类型的传递是引用传递而并非值传递呢?按照资料显示的,引用类型的参数传递传递的是引用变量的值,有什么方法可以证明一下呢?setNull()方法提供了这样的证明。

setNull方法的参数是数组的引用变量,程序中传入的是arr.进入方法,首先打印了array,然后将它置空再打印一次,然后在main方法中,打印arr的地址。程序运行的结果表示,array置空之前和arr指向的是同一区域,而后array=null却并没有影响到arr.

所以,可以肯定,当一个引用类型的变量被作为参数传递到方法中的时候,仅仅是将变量值复制后传递过去,而本身没有发生改变去指向其他。

当array=null的时候,array指向堆区的引用失效了。


以上的示例和分析都表明,Java中的确没有引用传递,当把一个引用类型的变量作为参数传递给方法的时候,也仅仅是将引用变量的值复制一份给了方法中的参数,自己始终指向原本的对象。 

WPF插件架构-如何动态加载封装好的第三方DLL的界面 插件架构中如何自动加载第三方DLL中的UI界面 阅读详情

相关推荐

STM32G474实战:数字LLC电源控制程序从零到跑通(附完整代码解析)

本文详细介绍了基于STM32G474微控制器开发数字LLC电源控制程序的完整实战流程。从硬件平台搭建、CubeMX工程配置,到核心控制逻辑、双速率中断框架、数字PID实现,再到Burst模式、状态机等高级策略与异常处理,提供了从零到跑通的系统化指南与代码解析,助力开发者掌握高效数字电源的程序编写与调试技巧。

s1t2u3的博客 1239

【Java笔记】引用类型的参数传值

Java的引用型数据有:1.对象2.数组3.接口当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。例:Circle.javapublic class Circle { double radius; Circle(double r) //构造函数 { radius=r; } double getArea() //计算面积 { r...

我很菜 5017

Java基础——参数传参(基本类型,引用类型传参)

java中基本数据类型和引用数据类型作为参数传递时的原理和过程,并解释了值传递与引用传递在Java中的区别,并涉及部分java的内存模型

yexiann的博客 8884

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

当检测到TCP/UDP混合攻击时,应触发预设的熔断策略:优先保障游戏大厅服务的UDP 27015端口,临时限制匹配系统的TCP连接数。针对Steam游戏服务器特有的UDP 4380端口,需配置协议合规性检查规则:限制数据包长度不超过128字节,强制校验请求来源IP的真实性。Steam游戏服务器的防护需要平衡安全性与玩家体验,通过协议深度解析、智能流量调度和服务端加固的三维防御体系,可构建游戏行业专属的抗DDoS护城河。答:采用弹性防护方案,基础防护带宽保持50Gbps,遭遇攻击时自动扩展至T级清洗能力。

2501_91486804的博客 1455

Zemax实现微透镜阵列光束整形(原理+仿真)

通过Zemax实现微透镜阵列的光场整形仿真。

VJCP_90909Bu0的博客 1万+

java 引用类型参数传递_详解Java引用类型的参数也是值传递

简述调用方法的时候,有需要传参数的情况。在Java中,参数的类型有基本类型和引用类型两种。一开始听到一个说法,Java没有引用传递,但是一直没有太多的思考在上面,直到前不久玩数组的时候,突然间发现把数组引用变量作为参数传递到一个方法当中进行操作之后,再去访问原数组,尽然改变了。于是乎,就想到了之前在C++里面学过的引用传递,突然有一种错愕的感觉,就查了一些资料,探究当Java引用类型变量作为参数传...

weixin_33945685的博客 918

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

Java引用类型值传递

引用类型值传递 @Data @Builder @AllArgsConstructor @NoArgsConstructor public class People { @Excel(name = "年龄",width = 15D) private int age; @Excel(name = "生日",width = 15D) private String birthDay; @Excel(name = "姓名",width = 15D) private

qq_31564573的博客 240

深入理解 Terraform 中的资源更新与管理

摘要:本文探讨Terraform处理AWS安全组名称变更时的行为。当修改不可变属性(如安全组名称)时,Terraform会创建新资源并删除旧资源。通过状态文件比对所需状态与实际状态,Terraform对不可变属性采用"先创建后删除"策略,对可变属性则直接更新。实例演示了修改安全组名称和关联EC2实例时的处理过程,强调理解资源属性可变性对基础设施管理的重要性。(149字)

2501_90323865的博客 472

YOLOv12改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

CARAFE内容感知的特征重新组合。

Limiiiing的博客 664

java实参传递

java java实参传递

SO_zxn的博客 1509

姿态传感器/陀螺仪之ICM-42670-P应用原理图设计

ICM-42670-P采用LGA-14封装,尺寸为2.5x3x0.76毫米,工作电压范围为1.71V至3.6V,支持I3CSM、I2C和SPI串行通信接口。其设计目标是提供高精度、低功耗和小型化的解决方案,以满足消费类和工业应用的需求。ICM-42670-P是一款由TDK InvenSense推出的高性能六轴MEMS运动追踪传感器,集成了3轴陀螺仪和3轴加速度计,适用于多种应用场景,包括可穿戴设备、游戏控制器、无人机、AR/VR设备等。

corlin6688的博客 1206

Java中的基本类型和引用类型,在函数参数传递时采用值传递

基本类型和引用类型都可以看作是对象。对于基本类型,其内存空间是分配在栈上的;而对于引用类型,在堆中分配内存空间外,还在栈上分配了一块空间,用于保存堆中内存空间的首地址,java通过垃圾回收机制进行堆中内存空间的自动垃圾回收。

记录和分享程序人生的点点滴滴 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java的引用类型交换两个值,辨析Java方法参数中的值传递和引用传递

小方法大门道小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示。public class MethodParamsPassValue {public static void doErrorHandle() {boolean a = false;int b = 5;passBa...

weixin_30647423的博客 383

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java中的参数传递,到底是值传递还是引用传递?

Java中的参数传递,到底是值传递还是引用传递? 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。 错误理解二:Java是引用传递。 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

iqqcode 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java中是值传递还是引用传递?

答案: Java中只有值传递。 针对值类型,传递的是实参的值,对于引用类型,传递的是引用值所存储的地址。 基本概念 1.形参与实参 形式参数:在定义函数名和函数体时使用的参数,目的是用来接收调用该函数是传入的参数。实际参数:在调用有参函数是,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数,称为实际的参数。 两者区别: 实参是调用有参方法的时候,真正传递的内容。而形参,是用于接收实参内容的参数。 举例如下: public static void ma

C18298182575的博客 752

Java的参数传递到底是值传递还是引用传递

Java的参数传递到底是值传递还是引用传递写在开头1、修改基本类型参数2、修改引用类型参数3、交换两个引用类型参数的引用结论 写在开头 简单粗暴点,开头直接呈上答案:在Java 中参数的传递总是采用“值传递”的方式。 解释一下什么是“值传递”和“引用传递”: 值传递(call by value):表示方法接收的是调用者提供的值。 引用传递(call by reference):表示方法接收的是调...

weixin_43164759的博客 489

Java引用类型的值传递

Java的参数传递 我们都知道Java传基本数据类型的参数时是按值传递,所以在被调方法里修改参数的值函数结束以后实参是不会发生变化的,例如 public Main{ public static void main(String[] args){ int x = 1 ; change(x); System.out.println("x=" + x); } public static...

程序漫漫 442

搞不清Java参数传递?拆解基本类型值传递与引用类型地址传递逻辑

数组是引用类型,classScores 存的是数组在内存里的 “地址”,传参的时候把这个地址复印一份给 scores,所以方法里的 scores 和外面的 classScores,指向的是同一个数组,改 scores [0],其实就是改了那个共同的数组,外面自然能看到变化。这是因为方法里的 scores 被改成了新数组的地址,相当于别人拿了你的钥匙复印件,却没去你家,反而自己买了个新房子,改新房子里的东西,自然和你家没关系了。咱们再总结一下,免得你记混:基本类型传参,改方法里的参数,原变量不变(传副本);

思索的涟漪,突破自我 345

为什么 Java 中只有值传递?

Java值传递

weixin_48170925的博客 583

值传递&引用传递

程序设计语言将实参传递给方法(或函数)的方式分为两种: 值传递 :方法接收的是实参值的拷贝,会创建副本。 引用传递 :方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。 很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。 为什么 Java 只有值传递? 案例1:传递基本类型参数 public static void main(String[] args) { int num1 = 10;

略简略烦的博客 375

五分钟学Java:Java到底是值传递还是引用传递?

在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个问题困扰过。实话实说吧,我就是其中之一。 来回顾一下提问者的问题: 我一直认为 Java 是按引用传递的,但是我看一些博客上说不是的。我就纳闷了,Java 到底是值传递还是引用传递?值传递和引用传递...

沉默王二 1万+

Java中的参数传递机制:值传递与引用传递的真相

详细介绍了Java的参数传递机制是基于值传递还是引用传递。

2201_75353178的博客 1707

call.addparameter 数组类型参数_java中的参数传递(只有值传递没有引用传递)

Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。java中的数据类型Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保存的值是引用值,"引用值"指向内...

weixin_32645721的博客 2806

面试官问我 Java 是值传递还是引用传递

Java 到底是值传递还是引用传递

JavaJasper的博客 576
上一篇: Java静态引入
下一篇: 第十届蓝桥杯算法竞赛
码途有约
博客等级 码龄10年 101粉丝 135原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值