首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有人可以向我解释在Java中传递"值"而不是"引用"背后的原因是什么?

在Java中,当我们传递参数时,基本数据类型(如int、char、boolean等)的值直接复制到方法中,而对象(如String、数组等)的引用被复制到方法中。这是因为,基本数据类型的值直接存储在栈内存中,而对象的引用存储在堆内存中。

当我们在方法中修改基本数据类型的值时,它会创建一个新的变量,并将值复制到新的变量中。因此,原始变量的值不会受到影响。而当我们在方法中修改对象的引用时,它会创建一个新的引用变量,并将引用复制到新的变量中。因此,原始引用变量的引用仍然指向原始对象。

例如,在Java中,我们可以通过以下方式传递基本数据类型和对象:

代码语言:java
复制
public static void main(String[] args) {
    int a = 10;
    int b = a;
    a = 20;
    System.out.println("a = " + a + ", b = " + b); // a = 20, b = 10

    String s1 = "hello";
    String s2 = s1;
    s1 = "world";
    System.out.println("s1 = " + s1 + ", s2 = " + s2); // s1 = world, s2 = hello
}

在上面的例子中,我们可以看到,当我们修改基本数据类型a的值时,变量b的值不会受到影响。而当我们修改字符串s1的引用时,变量s2的引用仍然指向原始字符串。

总之,在Java中,基本数据类型的值直接传递,而对象的引用被传递。这是Java设计者选择的一种方式,可以更好地控制内存分配和管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何避免 Java “NullPointerException”

本文中,我将解释这个问题根源并提供解决该问题方法。 2 问题根源:Java 弱类型安全 你听说过编译类型安全吗?如果不在本文中,您可以了解它是什么以及编译时和类型安全之间区别。...在上面的示例,我们尝试分配给 String 变量 Integer : 字符串变量 3 空引用破坏了 Java 类型安全性 Java 在编译期间验证变量类型和赋值类型。那有什么问题呢?...好吧,问题是 NULL 。Null 代表所有未初始化对象。而且,只要可以初始化任何对象,就可以将 Null 分配给任何类型。 因此,Java 允许下一个分配: 这里有什么问题?...潜在空指针异常 8 使用 != Null 检查避免 现在,让我们通过简单检查来防止这个问题,不是空检查: 简单检查 我们可以改进这个解决方案吗? 是的,我们可以使用 Optional。...16 总结 总结整篇文章,我建议如下: 更喜欢 Optional 不是传递 Null 使用检查器框架 老实说,在实践,Checker Framework 给您开发带来了限制。

2.8K20

算法细节系列(1):Java swap

算法细节系列(1):Java swap 问题 C++,swap算法可以用指针来实现,因此Java,如果采用如下代码来对两个数字进行交换时,也不会影响两个对象。...Java,上述版本swap方法,显然并没有对引用指向内存单元进行操作,只是改变了引用指向。...因此,我们得出一个解决方案,封装自己包装类,实现引用传递,并且引用传递过程,要改变实际内存单元。所以包装类我们需要有一个改变类基本类型方法。...这也就解释了为什么Integer无法实现swap原因了,不变类基本类型是final类型,即它只允许初始化一次,后续是不能被改变,否则就不符合int基本类型性质,且你Integer官方提供方法也无法找到改变初始方法...因此,swap基本都用在排序算法,而对数组传递,实际背后原理是对指针应用,所以该方法是奏效。 参考资料 Swap in JAVA, 不是想象简单 Java传参传递引用传递问题

1.2K20

一道面试题考验了你对java理解程度

有人可能在没经过仔细考虑情况下,给出以下答案 ? 很遗憾,这是错误。重要事注释三遍!!! 那么为什么错误,原因是什么?...传递引用传递 传递传递是实际,像基本数据类型 引用传递:将对象引用作为实参进行传递 java基本类型数据作为参数是传递,对象类型是引用传递。...main方法,CODE_1代码为声明了两个对象,分别设置value为1和2,swap1和swap2两个方法目的是为了交互这两个对象value 先思考一下,应该输出结果是什么 ......反编译出来结果为 ? 对比一下可以很清楚看到valueOf(int)方法被调用 回归 好,现在回归正题了,直接操作形参无法改变实际Integer又没有提供set方法,那是不是无解了呢?...我很好奇如果有人以下这样写,面试官会有什么反应 ? 既然出了肯定是有解可以实现,回头看看,在上面swap2那个例子是通过set方法来改变,那么Integer有没有提供呢?

49520

Java岗大厂面试百日冲刺【Day53】— 基础篇4 (日积月累,每日三题)

除此之外还有一个 hash 成员变量,是该 String 对象哈希缓存,这个成员变量也和本文讨论无关。Java,数组也是对象。 所以 value 也只是一个引用,它指向一个真正数组对象。...2、字符串已被广泛用作许多 Java参数,例如,为了打开网络连接,你可以将主机名和端口号作为字符串传递,你可以将数据库 URL 作为字符串传递, 以打开数据库连接,你可以通过将文件名作为参数传递给...这个原因也说明了,为什么 String Java 是最终,通过使 java.lang.String final,Java设计者确保没有人覆盖 String 类任何行为。...这个问题也可以定义为封装Char[]String类相比Char数组,对密码存储会有哪些不同?,这是最近在 Java 面试向我一位朋友询问问题。...由于任何有权访问内存转储的人都可以以明文形式找到密码,这是另一个原因,你应该始终使用加密密码不是纯文本。

35920

Java真的只有传递么?

这里意思是,不论是基本类型还是引用类型传给函数是实参地址拷贝,也就是内存地址,可以说是引用,只不过基本类型,函数内对参数操作时直接拷贝引用类型,需要先找到它位置,即地址、引用...最后说java传递,而这个是对象引用。 看到这明白了么? 地址就是引用,那是不是可以java引用传递了?...传递引用,计算机不全是吗,不是还能是什么,说是引用传递是侧重点不同传,传过去就是地址就是引用引用不用表示用啥 这里说不是一个概念,说基本类型传,这个是变量本身,说对象传也是...一般而言,引用会是数据存储于存储器或存储设备物理地址。因此,引用亦常被称为该数据指针或地址。 看看引用定义,引用是指一个XXX数据。好吧,引用本身就是一个。但不是还能是什么呢?...如果有人问你,你可以这么说,基本类型和他们包装类是传递引用类型传递是对象引用即地址,String传递也是地址,只不过函数内地址被修改了,所以不会影响到实参,因表现上和基本类型一样,所以可能为了便于记住这个现象才说

1.1K20

Stackoverflow上人气最旺10个Java问题

1、 为什么两个(1927年)时间相减得到一个奇怪结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒日期字符串并比较: ? 2、Java是“引用传递”还是“传递”?...(2480个赞) 我一直认为Java引用传递;然而,我看了一堆博客(例如这篇)声称不是这样。我认为我没有理解它们之间区别。 给个解释? 解决方案 Java一直是传递。...不幸是,他们决定把指针叫做引用,因此新人总是被搞晕。因为这些引用也是通过传递。...InputStream 转化成 String 最简单方法是什么? ? 6、为什么Java密码优先使用 char[] 不是String?...(1574个赞) Swing,密码字段有一个getPassword()(返回 char数组)方法不是通常getText()(返回String)方法。

61341

Stackoverflow上人气最旺10个Java问题

1、 为什么两个(1927年)时间相减得到一个奇怪结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒日期字符串并比较: ? 2、Java是“引用传递”还是“传递”?...(2480个赞) 我一直认为Java引用传递;然而,我看了一堆博客(例如这篇)声称不是这样。我认为我没有理解它们之间区别。 给个解释? 解决方案 Java一直是传递。...不幸是,他们决定把指针叫做引用,因此新人总是被搞晕。因为这些引用也是通过传递。...InputStream 转化成 String 最简单方法是什么? ? 6、为什么Java密码优先使用 char[] 不是String?...(1574个赞) Swing,密码字段有一个getPassword()(返回 char数组)方法不是通常getText()(返回String)方法。

60731

用画小狗方法来解释Java传递

不是!myDog只是一条遛狗用狗绳! ? 换句话说说,myDog并不是new出来放在堆对象(object)!myDog只是一个指向这个对象实例引用(reference)!...最后打印出来还是1. 传递引用传递 上面提到参数传递过程复制操作,说白了,就是 = 操作。...之所以Java可以方法体内部改变方法体外部对象,是因为方法体内部拿到了对象引用,但是这个引用是和方法体外部引用属于两个不同引用,方法体内部引用指向别的对象,不会导致方法体外部引用也指向别的对象...引用传递替代方法 引用传递有两个好处: 引用传递可以避免调用方法时进行拷贝,尤其是当方法入参是个大对象时,拷贝会耗费大量时间和空间,当然,这一点Java已经巧妙地解决了,因为对于对象,拷贝只是它引用而已...; 引用传递可以对外面的对象进行修改,这也是很多语言支持引用传递原因

85720

【77期】这一道面试题就考验了你对Java理解程度

重要事注释三遍 那么为什么错误,原因是什么?...,调用testA时,传递就是实参,而在testA方法签名参数为形参 从作用域上看,形参只会在方法内部生效,方法结束后,形参也会被释放掉,所以形参是不会影响方法外 传递引用传递 传递传递是实际...,像基本数据类型 引用传递:将对象引用作为实参进行传递 java基本类型数据作为参数是传递,对象类型是引用传递 实参是可以传递给形参,但是形参却不能影响实参,所以,当进行传递情况下,改变是形参...方法,CODE_1代码为声明了两个对象,分别设置value为1和2,swap1和swap2两个方法目的是为了交互这两个对象value 先思考一下,应该输出结果是什么 … … type1...对比一下可以很清楚看到valueOf(int)方法被调用 回归 好,现在回归正题了,直接操作形参无法改变实际Integer又没有提供set方法,那是不是无解了呢?

41930

Python面试可能会问到问题,你会几个?

不是有人都有天赋有能力来做这个行业,大学高数线代离散都没及格就想从Java进军人工智能市场,那你就省省吧,毕竟如果连最基本线代离散都不会,这样AI我看不是AI,是BI(悲哀)!...Python有自带垃圾回收系统,它回收并释放没有被使用内存,让它们能够被其他程序使用。 数组和元组之间区别是什么? 数组和元组之间区别:数组内容是可以被修改元组内容是只读。...另外,元组可以被哈希,比如作为字典关键字。 参数按传递引用传递是怎样实现? Python一切都是类,所有的变量都是一个对象引用引用是由函数确定,因此无法被改变。...但是如果一个对象是可以被修改,你可以改动对象。 Pythonunittest是什么Python,unittest是Python单元测试框架。...它拥有支持共享搭建、自动测试、测试暂停代码、将不同测试迭代成一组,等等功能。 Python模块和包是什么Python,模块是搭建程序一种方式。

53230

2020最全Java面试题--基础篇

所有这些可移植性背后Java字节码。 Java编译器生成字节码可以由任何JVM解释。 因此,用Java编写程序并期望它们可以在任何平台上运行变得容易得多。...10.Java,如果我们不为局部变量指定任何,那么局部变量默认是什么Java不会使用任何默认初始化局部变量。 因此,这些变量默认情况下将为null。...11.假设我们传递任何参数情况下运行Java类。 Main方法参数String数组是什么? 默认情况下,Java参数String数组为空。...基于对象编程语言提供对对象支持,您可以从构造函数构建对象。 他们语言还支持封装。 这些也称为面向原型语言。 3. Java,定义为对象实例变量对象引用默认是什么?...没有图书馆就不可能存在图书馆书籍。 因此,书籍和图书馆是组合关系。 7. 为什么Java没有指针? Java,有引用不是指针。 这些引用指向内存对象。 但是不能直接访问这些存储位置。

55731

JavaSE 基础知识(常识概念 + 基础语法)问答总结面试题 —— 讲给应届生 Java 开源知识项目

过程:编写 -> 编译 -> 解释(这也是 Java编译与解释共存原因) 首先通过IDE/编辑器编写源代码然后经过 JDK 编译器(javac)编译成 Java 字节码文件(.class文件),字节码通过虚拟机执行...1.2.2 Java 与 C++ 指针:Java 语言不显式地向用户提供指针来访问内存,添加了自动内存管理功能,可以避免 C/C++ 因操作失误导致野指针问题,使程序更安全(只是不提供,并不是没有指针...),可以参加表达式运算,字符串常量代表一个地址(该字符串在内存存放位置) 占内存大小不同:字符常量只占 2 个字节( char Java 占两个字节),字符串常量占若干个字节 2.5 char...方法 4.1 Java 中方法参数传递传递还是引用传递 Java 中方法参数传递方式是按传递。 如果参数是基本类型,传递是基本类型字面量值拷贝。...形式参数改变对实际参数没有影响 如果参数是引用类型,传递是该参量所引用对象地址拷贝。

62920

一句话说清聚集索引和非聚集索引以及MySQLInnoDB和MyISAM

聚集索引和非聚集索引以及MySQLInnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,数据库 聚集索引和非聚集索引以及MySQL...InnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,网上帖子很多,也说都对,但是呢,看客可不一定是真的理解了。...InnDB最关键就是聚集索引叶子节点存所有的数据项,二级索引存是主键值,不是行指针,MyISAM存是行指针:  ?...下面这个帖子也是写极好 ,作者很会画图,整体还是没用超越《高性能MySQL(第3版)》,如果上面的还看不懂可以看看此贴--《MySQL索引背后数据结构及算法原理》。...第二个与MyISAM索引不同是InnoDB辅助索引data域存储相应记录主键不是地址: ?

4.5K31

程序员面试标准答案并不标准

一些极少数甚至坚持和试图向我解释我应该如何理解他们答案。这已经成为了一种个性问题,而且毫无疑问是面试要pass掉的人。”...然后,当潜在客户会议要求他讲解静态方法是什么时候,他完全搞砸了,他牛头不对马嘴地开始谈论起构造函数和其他一些文不对题东西。...一些极少数甚至坚持和试图向我解释我应该如何理解他们答案。这已经成为了一种个性问题,而且毫无疑问是面试要pass掉的人。 呵呵,真是狂妄自大,索性你就叫“编程面试上帝”得了。...你甚至可以直接使用类名称执行静态方法,不需要任何类实例。甚至整个JVM没有类一个实例,它也可以运行。因此,哪里能够调用一个运行连接到实例普通方法?...然而: 话又说回来,这时出来一个候选人他回答是:yes。他甚至开始解释这样情况可能发生在静态方法访问实例时候。它可能会得到一个实例作为方法参数,并且通过那个引用,它可以调用实例方法。

27210

程序员面试标准答案并不标准

随后,他宣称,“有时候,我会碰到那些不但不知道答案,还自作聪明地给出错误答案候选人。知道错误答案比不知道更糟糕。一些极少数甚至坚持和试图向我解释我应该如何理解他们答案。...然后,当潜在客户会议要求他讲解静态方法是什么时候,他完全搞砸了,他牛头不对马嘴地开始谈论起构造函数和其他一些文不对题东西。...一些极少数甚至坚持和试图向我解释我应该如何理解他们答案。这已经成为了一种个性问题,而且毫无疑问是面试要pass掉的人。 呵呵,真是狂妄自大,索性你就叫“编程面试上帝”得了。...你甚至可以直接使用类名称执行静态方法,不需要任何类实例。甚至整个JVM没有类一个实例,它也可以运行。因此,哪里能够调用一个运行连接到实例普通方法?...然而: 话又说回来,这时出来一个候选人他回答是:yes。他甚至开始解释这样情况可能发生在静态方法访问实例时候。它可能会得到一个实例作为方法参数,并且通过那个引用,它可以调用实例方法。

54770

浅析Javafinal关键字

j都是一样i却是不同。...从这里就可以知道final和static变量区别了。 4.匿名内部类中使用外部局部变量为什么只能是final变量?   这个问题请参见上一篇博文中《Java内部类详解》解释,在此处不再赘述。...殊不知,方法changeValue和main方法变量i根本就不是一个变量,因为java参数传递采用传递,对于基本类型变量,相当于直接将变量进行了拷贝。...有这种想法朋友可以自己动手写代码试一下这样结果是什么,如果把final去掉了,然后changeValue让buffer指向了其他对象,也不会影响到main方法buffer,原因在于java采用传递...,对于引用变量,传递引用,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

38610

30道最常问Java基础面试题

这种独立于硬件和操作系统,正是java程序可以一次编写多处执行原因。...StringBuffer每次都会对StringBuffer对象本身进行操作,不是生成新对象并改变对象引用。...返回方法里作用是什么?**方法返回是指我们获取到某个方法体代码执行后产生结果!(前提是该方法可能产生结果)。返回作用:接收出结果,使得它可以用于其他操作!**21....Java传递引用传递****传递**是指对象被值传递,意味着传递了对象一个副本,即使副本被改变,也不会影响源对象。(因为传递时候,实际上是将实参复制一份给形参。)...**引用传递**是指对象被引用传递,意味着传递不是实际对象,而是对象引用。因此,外部对引用对象改变会反映到所有的对象上。(因为引用传递时候,实际上是将实参地址复制一份给形参。)

26210

浅析Javafinal关键字

j都是一样i却是不同。...从这里就可以知道final和static变量区别了。 4.匿名内部类中使用外部局部变量为什么只能是final变量?   这个问题请参见上一篇博文中《Java内部类详解》解释,在此处不再赘述。...殊不知,方法changeValue和main方法变量i根本就不是一个变量,因为java参数传递采用传递,对于基本类型变量,相当于直接将变量进行了拷贝。...有这种想法朋友可以自己动手写代码试一下这样结果是什么,如果把final去掉了,然后changeValue让buffer指向了其他对象,也不会影响到main方法buffer,原因在于java采用传递...,对于引用变量,传递引用,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

95270

深挖String

process2 打印 老王 二当家 这里有人说是引用传递 因为我修改了下 影响原来值了 不就是引用传递吗 process3 打印 老王 老王 又有人说这里是传递 因为修改数据了 没改变原来变量...(java传递还是引用传递 我个人认为按照这样说 更好 市面上八股文 都混淆不堪 难以下咽 传递 确切来说是地址传递 形参是copy实参地址 方法每个变量都会在栈开辟新地址可以接受这个地址...基本数据类型是直接接受 引用数据类型接受堆地址 这也是为什么传递对象之间修改会改变实参 new对象的话实参对象不会修改原因 这里抛出一个问题: 我在学习时 看到这样一句话:String... JDK9 当中,字符串相加 “+” 改为了用动态方法 makeConcatWithConstants() 来实现,不是大量 StringBuilder 了 八、为什么String设计成不可变?...通过字符串常量池就可以节省很多资源 如果不可变的话修改一个的话 其他引用也会被修改 这不是我们预期 hashCode缓存 性能 因为String不可变 可以用字符串常量池缓存 节省内存

17320

Java只有按传递,没有按引用传递

今天,我一本面试书上看到了关于java一个参数传递问题: 写道 java对象作为参数传递给一个方法,到底是传递,还是引用传递? 我毫无疑问回答:“引用传递!”...当一个对象实例作为一个参数被传递到方法时,参数就是该对象引用一个副本。指向同一个对象,对象内容可以在被调用方法改变,但对象引用(不是引用副本)是永远不会改变。...为什么这里是“传递”,不是引用传递”? 我还是用图表描绘比较能解释清楚: ?...【注意:java,新创建实体对象堆内存开辟空间,引用变量栈内存开辟空间】 正如如上图所示,左侧是堆空间,用来分配内存给新创建实体对象,红色框是新建Person类实体对象,000012...回顾一下上面的一个传递例子,传递,就是将存储单元内容传给调用函数那个参数,这里是不是异曲同工,是所谓“传递”,而非“引用传递”!!! 那为什么对象内部能够发生变化呢?

1.1K90
领券