Java 的值传递和引用传递

article/2025/9/12 23:45:21

一、概述

Java数据类型分为基本类型和引用类型。相应的,变量也有两种类型:基本类型和引用类型。

1️⃣基本类型的变量保存原始值,即它代表的值就是数值本身。包含:
整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean

2️⃣引用类型的变量保存引用值,“引用值”指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在该引用值所表示的地址的位置。包含:数组、类、接口。

二、变量的基本类型和引用类型的区别

  1. 基本数据类型在声明时系统就给它分配空间
int a;
a=10;//正确,因为声明a时就分配了空间
  1. 引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间
Date date;
//执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给date变量 
date=new Date();
//如果注释掉上一步操作
//The local variable date may not have been initialized
//也就是说对象的数据空间没有分配
date.getDate();

看下初始化过程,注意“引用”也是占用空间的,一个空Object对象的引用大小大概是4byte:

Date a,b; //在内存开辟两个引用空间
a = new Date();//开辟存储Date对象的数据空间,并把该空间的首地址赋给a
b = a; //将a存储空间中的地址写到b的存储空间中

三、值传递和引用传递

方法的参数分为形式参数和实际参数

  • 形参:定义方法时写的参数。
  • 实参:调用方法时写的具体数值。

通常,基本数据类型是值传递,引用数据类型是引用传递(地址传递)。无论是值传递还是引用传递,形参拿到的仅仅是实参的副本,而不是实参本身。

值传递

方法调用时,实参把它的原始值传递给对应的形参,方法接收的是原始值的一个副本,此时内存中存在两个相等的基本类型,即实参和形参。方法的操作都是对形参的修改,不影响实参的值。

官方解释:值传递是指在调用方法时将实际参数复制一份传递到方法中,这样在方法中如果对参数进行修改,将不会影响到实际参数。

引用传递

也称为传地址。方法调用时,实参的引用(地址,而不是参数的值)被传递给方法中相对应的形参,方法接收的是原始值的内存地址。在方法执行中,形参和实参内容相同,指向同一块内存地址,方法的操作将会影响到实际对象。
官方解释:引用传递是指在调用方法时将实际参数的地址传递到方法中,在方法中对参数的修改,将影响到实际参数。

看一个例子:

public class MyObj {public int b=99;
}

分别传参int和对象类型:

public class ReferencePkValue2 {public static void main(String[] args) { ReferencePkValue2 t = new ReferencePkValue2(); int a=66; t.test1(a);//这里传递的参数a就是按值传递 System.out.println("a1:"+a);MyObj obj=new MyObj(); t.test2(obj);//这里传递的参数obj就是引用传递System.out.println("obj.b1:"+obj.b);} public void test1(int a){ a=a++;System.out.println("a2:"+a);} public void test2(MyObj obj){ obj.b=100;System.out.println("obj.b2:"+obj.b);}
}

输出是:
a2:66
a1:66
obj.b2:100
obj.b1:100

可以看到,int 值没有发生变化,但是在 test2 方法中对 obj 类做的修改影响了 obj 这个对象。String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作

看下面的例子:

public class ReferencePkValue1 {public static void main(String[] args){ReferencePkValue1 pk=new ReferencePkValue1();//String类似基本类型,值传递,不会改变实际参数的值String test1="Hello";pk.change(test1);System.out.println(test1);//StringBuffer和StringBuilder等是引用传递StringBuffer test2=new StringBuffer("Hello");pk.change(test2);System.out.println(test2.toString());}public void change(String str){str=str+"World";}public void change(StringBuffer str){str.append("World");}
}

输出是:
Hello
HelloWorld

四、结论

结合上面的分析,关于值传递和引用传递可以得出这样的结论:

  1. 【值传递】将实参的值,copy 一份给形参,对形参的修改不会影响实参。
  2. 【引用传递】将实参的地址值,copy 一份给形参,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。
  3. String、Integer、Double 等 immutable 的类型特殊处理,可以理解为传值,最后的操作不会影响实参对象。

http://chatgpt.dhexx.cn/article/d303GI3O.shtml

相关文章

java值传递和引用传递(附实例)

java值传递和引用传递(附实例) 1.数据类型1.1 基本数据类型1.2 引用数据类型 2.形参与实参2.1 函数中使用2.2 调用 3.值传递和引用传递3.1 定义3.2 例子3.3 结论 观前提示: 本文所使用的IDEA版本为ultimate 2019.1,JDK版本为1.8.…

java中的值传递和引用传递

个人理解,可能会有错误之处,请仔细甄别,谨慎参考!如有错误或不同见解请指出! 值传递(Pass By Value或者Call By Value)是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。…

【JAVA】值传递与引用传递

一.声明 Java中没有引用传递 二.值传递和引用传递 值传递:就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来的实参。 引用传递:是在方法调用的时候,实参将自…

值传递与引用传递详解

1、关于值传递 值传递:是指在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数 如下图所示,当传递参数之前会将参数进行复制,函数中修改了参数&#xff0c…

值传递与引用传递的区别

一、值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 ​ 代码在内存中的执行流程: 1、首先加载main方法; ​ 2、接下来int number 100&#xff1…

什么是值传递,什么是引用传递?

1、什么是值传递,什么是引用传递? 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递(pass by referenc…

Java复习总结之快速区分值传递和引用传递

引言 为了搞清楚值传递和引用传递的区别,查阅了许多资料,加以自身理解,做出本篇博客用于记录。 概念 值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到…

华为应聘进展状态码解析(附加性格测试攻略)

多方查找咨询终于终于看到了自己的状态码,总结一下~ 性格测试攻略: https://blog.csdn.net/guomutian911/article/details/48915301 https://blog.csdn.net/twc829/article/details/51226358 https://blog.csdn.net/twc829/article/details/51226247 第三…

华为OD机试2023 最新最全备考攻略助你轻松上岸

【华为OD机试真题 2022&2023】真题目录 点这里 【华为OD机试真题】信号发射和接收 &试读& 点这里 【华为OD机试真题】租车骑绿道 &试读& 点这里 什么是华为OD 华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多…

idea 怎么导入maven项目

1、打开一个现有的IntelliJ IDEA工程,点击菜单的“File”->“new”->“Module from Existing Sources”。 更详细请点击:http://yayihouse.com/yayishuwu/chapter/1826

IntelliJ IDEA如何导入Gradle项目

https://blog.csdn.net/wangdong5678999/article/details/70255451 IntelliJ IDEA如何导入Gradle项目 栋先生 2017-04-20 10:14:03 95942 收藏 分类专栏: 其他 文章标签: idea intellij idea gradle 版权 最近学习Gradle,本文来重点介绍…

杂记——16.idea中导入maven项目

这篇文章我们来讲一下如何从Gitee上拉取项目,并将该项目导入到idea中 目录 1.拉取项目 2.idea导入项目 3.更改相关的配置 3.1更改maven仓库 3.2更改数据库的连接池 1.拉取项目 第一步:找到相关的项目地址 如图所示,在Gitee上找到相关的…

idea项目导入eclipse中步骤

1、打开eclipse,右键import 找到需要导入的项目 2、重新配置tomcat,已经配置好了建议移除后重新添加, window-preference 3、项目上右键-debug AS-发现没有 debug on server,这是没有转成web项目 项目右键-properties 配置好后会出…

idea与eclipse项目相互导入方式

目录 idea项目往eclipse中导入 idea项目导出到桌面 idea项目导入到工程中 idea项目迁徙到eclipse 第一种导入方式: 第二种导入方式: 第三种导入方式: eclipse项目往idea中导入 idea项目往eclipse中导入 idea项目导出到桌面 直…

idea中导入maven项目并运行

当我们从网上下载人家的maven项目该怎样导入并运行呢,请看如下步骤。 File->New->Project from Existing Source 选择maven项目下的pom.xml文件 File -> Project Structure 填写编译输出路径 6. 如果右边的某些项是红色的,点击右边的maven进行…

IDEA中导入Maven工程或项目

IDEA中导入Maven工程或项目 本文简单讲述了IDEA中导入Maven工程或项目。为了减轻读者压力笔者将 IDEA 相关应用技巧分解成了多篇文章置于主页 IDEA 专栏,若本文没有帮助到您,请去主页 IDEA 专栏检索吧 😏。 文章目录 IDEA中导入Maven工程或项…

使用IDEA导入SpringBoot项目

有时候会拿到别人现成的 springboot 项目,而不是从头自己做一个。 这个时候,就需要用导入的方式来 import 这么一个项目了。 1.IDEA 导入 SpringBoot 项目办法: 1)菜单 -> File -> New -> Project from Existing Sourc…

Intellij IDEA 导入 eclipse web 项目详细操作

Intellij IDEA 导入 eclipse web 项目详细操作 第一步:准备工具我用的是 IntelliJ IDEA 2017.1(64) 这个版本的,在eclipse中找到我之前写skye_cnmy(非Maven),skye_client(Maven)的项目导入。 第二步:在Intellij IDEA File–>New–>Pr…

IDEA导入本地项目

1.文件-New—-Model from Existing Sources 2.选中需要导入的项目 3、选择maven文件选项,从外部模型导入模块。 Idea本地项目部署路径 IDEA不会把你的项目部署到你的Tomcat安装目录,它会在操作系统盘的用户目录下新建一个目录,这个目录一般是…

idea如何import_导入项目

今天"炸药"问我idea如何导入项目: 先close project 再到开始界面import,然后一直next就可以了。 具体操作和注意事项 特别注意: >>> 开始导入项目前,注意,删掉别人电脑的idea配置和class&#xf…