JAVA怎么在函数内改变传入的值

本文详细解析了Java中方法调用的过程及参数传递机制,包括值传递和引用传递的区别,以及如何通过数组作为参数进行引用传递来改变实参的值。通过实例演示了Java中方法调用的基本概念。
public class TestInt 
{
    public int aa(int i)
    {
        return i+4;
    }
    public static void main(String [] args)
    {
        int i=3;
        aa(i);
        System.out.println(i);
    }
}

主函数main()这个静态方法无法
引用非静态方法 aa(int)的。
函数调用时,参数传递的方式主要有两种: 值传递和引用传递。
Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找到变量的值。
无论是在C、c++还是java中传值是无法改变实参的值的,
就比如要交换两个整型数的值。
java中得通过传引用的方式改变实参的值。
所以可以传通过数组这种引用方式来改变实参的值!

public class TestInt { 
    public static void aa(int[] i) { 
        i[0] += 4; 
    } 
    public static void main(String [] args) {
        int[] i= {3}; 
        aa(i); 
        System.out.println(i[0]); 
    }
}

 

转载于:https://www.cnblogs.com/kuqs/p/5473012.html

<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. 避免通过参数修改产生副作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值