在java中将参数传递给方法是传递参数的副本。 这意味着在方法运行时会分配保留参数值副本的内存空间,更改副本值不会影响原始参数。
要理解形参和实参,避免编码所需的错误,需要明确两个概念。
1、什么是形参和实参
2、方法调用时参数传递的过程
3、传价和传参
import lombok.allargsconstructor; importlombok.Data; importlombok.NoArgsConstructor; publicclassargumentstest { publicstaticvoidmain { string [ ] args }
EMPEMPA=newEMP('ke ',22 ); int num=22;
apply(EMPA;
system.out.println(EMPA;
apply2(num );
system.out.println(num;
}publicstaticvoidapply(EMPEMP ) )
EMP=newEMP(Li ),77 );
}publicstaticvoidapply2(Intnum ) {
num=33;
}
@AllArgsConstructor
@NoArgsConstructor
@ datastaticclassemp { privatestring name; 私有增量;
}
}
首先什么是形参? 什么是实参?
在上述代码中,apply方法的参数emp是表示参加该方法的实际参数的逻辑的波形参数、波形参数; 实参是在调用方法时传递给方法的参数值,是main方法的empA。
方法运行时如何传递参数?
首先,每个变量对应于存储参数值的内存区域。 在执行方法时,虚拟机会在堆栈中创建内存空间并保存实例的副本。 该内存空间在方法调用结束时被丢弃,对副本的更改不影响原始参数的值。
传价和传参?
java有两种数据类型:基本类型和引用类型。 如果变量是基本类型,则为保存在与变量对应的内存空间中的变量值。 例如,在上述代码中为num保存22; 如果变量是引用类型,则内存保存堆中实际对象的地址。
另一方面,方法调用时传递的是变量对应于内存中的值,不同之处在于基本类型参数将值传递给方法,引用类型参数将对象的存储器地址传递给方法。
引用类型包括类类型、接口类型和数组。
执行以上代码:
结果:
argumentstest.EMP(name=ke,age=22 ) 22
原始参数值未更改。
引用类型参数的值已更改
改变APP方法的逻辑:
publicstaticvoidapply{
EMP.setname(Li );
EMP.setage(44;
}
结果:
argumentstest.EMP(name=Li,age=44 ) )。
原始参数已更改。 为什么?
这是因为,虽然方法中的参数是原始参数的副本,但实例对象的堆中只有一个数据,所以直接修改对象的属性值就可以修改原始参数值。
对于数组,可以更改单个数组元素的值,如所示。
在包类中,可以通过反射方式修改内部value来获得相同的效果。