Java中如何在函数中修改参数的值

本文探讨了Java中StringBuffer作为引用类型的行为特点。通过对比C++中的引用概念,解释了为何直接修改StringBuffer对象不会影响原始变量,并提供了解决方案。

PS:本人是最近才接触Java的,在这之前一直学习C++。在刚开始接触到Java时,各种书籍和视频都在强调Java是纯面向对象的语言,除去基本数据类型外任何变量都是引用类型。

 

我遇到的问题如下:

我写了如下代码

public class TestStringAddress{
	public static void main(String[] args){
		TestStringAddress teststring = new TestStringAddress();
		StringBuffer hello = new StringBuffer("Hello");
		StringBuffer world = new StringBuffer("World");
		
		teststring.ModifyString( hello, world);
		
		System.out.print(hello + " ");
		System.out.println(world);
	}
	
	public void ModifyString(StringBuffer hello, StringBuffer world){
		hello = new StringBuffer("World");
		world = new StringBuffer("Hello");
	}
}


然后运行,输出结果如下

我发现字符串根本没有改变。MidifyString的参数不是一个引用吗?为什么没有改变呢?

修改MidifyString函数如下:

public void ModifyString(StringBuffer hello, StringBuffer world){
		//hello = new StringBuffer("World");
		//world = new StringBuffer("Hello");
		hello.append(" Hello");
		world.append(" World");
	}


打印输出:

这次修改了。

后来才明白原因:这些形参只不过是与实参指向相同的地址,他们不是同一个变量,只是单纯的将实参指向的值拷贝给形参。与C++中所说的引用不同。所以只能通过点操作修改值。

那么能不能不通过点操作进行修改实参呢?这里我能想到的只能是通过返回值修改实参的指向。

不知道别人有没有其他方法?

<think>好的,我现在需要帮助用户理解在Java中如何修改传入函数参数本身的。用户之前已经得到了一个回答,里面提到了几个排序算法,但现在的提问是关于Java参数传递的,所以我要确保我的回答集中在这一点上,并且结合用户提供的引用内容。 首先,我需要回顾用户提供的引用内容: 引用[1]提到,对于对象(基本数据类型),在函数内部修改不会影响外部的变量,因为它们存放在调用栈中,是两份不同的。例如,修改基本类型参数不会改变main函数中的原始。 引用[2]中的例子显示,当传递对象时,如果在方法内修改对象的属性(比如调用setA),这个改变会影响到原始对象,但如果将参数重新指向新对象(obj = new Obj(3)),则后续的修改不会影响原来的对象,因为此时形参指向了新对象,而实参仍然指向原来的对象。 引用[3]总结道,基本数据类型是传形参不会改变实参;引用类型作为参数时,对引用的操作(比如重新赋)不会改变原来的引用,但修改引用对象的属性会影响原对象。 用户现在的问题是,如何在Java修改传入函数参数本身的。根据引用内容,我需要明确以下几点: 1. Java参数传递方式:对于基本类型是传,对于引用类型也是传(即传递引用的副本)。 2. 修改基本类型参数不会影响外部变量。 3. 修改引用类型参数的属性会影响原对象,但重新赋参数(使其指向新对象)不会改变外部变量。 用户可能希望知道如何让函数内部对参数修改影响到外部的变量,特别是在引用类型的情况下,或者是否有办法改变基本类型的。 接下来,我需要考虑用户的真实需求。用户可能遇到了在方法内部修改参数后,外部变量没有变化的问题,想知道如何正确实现这种修改。需要明确说明Java参数传递机制,并提供解决方法,比如使用返回、包装类或数组等。 根据用户提供的引用,特别是引用[2]和[3],可以总结出: - 对于对象,修改其属性会影响原对象。 - 重新赋参数引用不会改变外部引用。 - 基本类型无法通过方法参数修改。 因此,我需要组织回答结构,先解释Java参数传递机制,然后分情况讨论,最后给出解决方案。同时,要确保引用正确的引用标记,比如[^1][^2][^3],并给出示例代码。 需要注意用户可能存在的误区,例如认为传递对象引用时,重新赋参数会影响外部变量,但实际上只是改变形参的指向。因此,需要明确说明这一点,并提供正确的做法,比如通过方法返回或者使用可变的容器类。 最后,生成相关问题,帮助用户进一步理解相关主题,比如参数传递机制、传递与引用传递的区别等。</think>根据Java参数传递机制及修改需求,分以下情况说明: ### 一、参数传递本质 Java严格采用**传递**方式: 1. 基本类型:传递数副本 2. 引用类型:传递对象地址的副本(即复制指针) ### 二、修改策略与效果 #### 1. 基本数据类型(无法修改) ```java void change(int num) { num = 10; // 仅修改副本 } ``` 此时外部调用`change(a)`后,原变量$a$的不变[^1] #### 2. 引用类型对象(可修改对象属性) ```java class Person { String name; } void modifyProperty(Person p) { p.name = "Alice"; // 修改堆内存对象属性[^3] } ``` 调用后原对象的$name$属性被修改 #### 3. 引用类型重新赋(无法改变原引用) ```java void changeReference(Person p) { p = new Person(); // 仅改变形参指针指向[^2] } ``` 此时外部引用仍指向原对象 ### 三、实现参数修改的解决方案 #### 方法1:返回覆盖 ```java int modify(int val) { return val * 2; // 返回新 } // 调用 a = modify(a); ``` #### 方法2:使用包装类 ```java class MutableInt { int value; } void change(MutableInt wrapper) { wrapper.value = 100; // 修改堆内存对象属性 } ``` #### 方法3:数组容器 ```java void modifyArray(int[] arr) { arr[0] = 99; // 修改数组元素 } ``` ### 四、特殊案例对比 | 操作类型 | 方法内修改效果 | 外部可见性 | |----------------|--------------|---------------| | 基本类型赋 | 修改副本 | 不可见[^1] | | 对象属性修改 | 修改堆内存 | 可见[^3] | | 引用重新指向 | 改变指针副本 | 不可见[^2] | ### 五、设计建议 1. 优先采用返回方式 2. 需要多返回时使用DTO对象 3. 并发场景使用线程安全容器 4. 避免通过参数修改产生副作用
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值