Java 中的参数传递是按值还是按引用?

Java 中的参数传递是按值还是按引用?

回答重点

在 Java 中,参数传递只有按值传递,不论是基本类型还是引用类型。

  • 基本数据类型(如 int, char, boolean 等):传递的是值的副本,即基本类型的数值本身。因此,对方法参数的任何修改都不会影响原始变量。

  • 引用数据类型(如对象引用):传递的是引用的副本,即对象引用的内存地址。因此,方法内可以通过引用修改对象的属性,但不能改变引用本身,使其指向另一个对象。

扩展知识

基本类型与引用类型的区别
  • 基本类型:包括 intfloatdoublecharboolean 等,存储在栈内存中。方法中对基本类型参数的操作只会影响传递的副本,原始变量的值不受影响。
  • 引用类型:包括所有的对象和数组,引用类型的变量存储的是对象在堆内存中的地址。当引用类型作为参数传递时,传递的是这个地址的副本。因此,方法内的修改可以影响到传入的对象的内容,但不会影响对象引用本身的地址。

企业微信截图_410280b2-919d-4e4d-953e-fd8350f95a99.png

示例代码分析

![[Pasted image 20250114132446.png]]

  • 在 modifyPrimitive 方法中,num 是基本类型的副本,因此对它的修改不影响原始变量 a
  • 在 modifyObject 方法中,obj 是引用类型的副本,但这个副本仍指向原始对象,因此修改 value 属性会影响原始对象。
  • 在 resetReference 方法中,obj 被重新赋值为一个新对象,这个变化只影响副本,不影响原始引用。
不可变类

关于引用的回答后,面试官可能会接着问不可变类。不可变类在多线程环境中不需要额外的同步控制,因为它们的状态一旦创建就不能改变。
String 类型作为形参时,是值传递还是地址传递

问题
关于 String 类型作为方法的形参时,究竟是值传递还是地址传递?

解答
在 Java 中,方法参数的传递方式是值传递。即使是 String 类型,传递的也是对象引用的值,并非直接传递对象本身或对象的地址。

具体分析
  1. String 的不可变性

    • String 在 Java 中是不可变类,一旦创建,其内容就不能修改。
    • 这意味着当我们对 String 类型变量进行操作时,实际上是在创建新的 String 对象,而不是修改原有的对象。
  2. 值传递 vs 地址传递

    • 值传递:方法调用时,传递的是变量存储的值(对于对象,存储的是对象的引用值,而非对象本身)。
    • 地址传递:如果是地址传递,方法中对对象的任何修改都会直接影响原始对象。
  3. 示例代码

public class TestString {
   
   
    public static void main(String[] args) {
   
   
        String str = "Hello";
        modifyString(str);
        System.out.println("Main方法中的字符串:" + str);
    }

    public static void modifyString(String s) {
   
   
        s = s + " World";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只蜘猪

感谢!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值