方法的调用和参数的传递
在java中,经常需要调用其它方法,而当调用的方法有参数时,我们就需要传递参数,传递的参数又分为值传递和对象引用传递
package test
class Test{
void methodA(){
int i = 1;
Integer integer = 10;
// 调用methodB方法,i是值的传递,integer是引用的传递
methodB(i, integer);
}
/*
* 被调用的方法1
*/
void methodB(int i, Integer integer){
System.out.println("i:" + i);
System.out.println("integer:" + integer);
}
// main方法
public static void main(String[] args){
Test t = new Test();
t.methodA();
}
}
运行结果:
值传递
在java中,传递的参数为基本类型时,是值的传递
为什么基本类型是值传递呢?首先,我们要知道,java定义的基本类型被存储在栈中,在传递参数时,先定义一个要被传递的参数,拿上面的 int i = 1来说,需要在栈内存空间中开辟一小块空间用来存储这个值1,而传递参数时,将这片空间拷贝了一份,赋值给方法的形参,所以基本类型都是值传递。
由于methodB中的参数i指向一个新的内存空间,所以不论methodB中的参数i如何变化,都无法改变methodA中变量i的值。
引用传递
传递的参数为对象时,是引用的传递,这是因为对象的存储是在堆内存中,而栈内存中只保存对象在堆内存中的地址。
画图演示:
可以看出,在传递对象参数时,是将堆内存中指向对象实际位置的地址复制了一份,因为两个方法中的地址引用相同,他们指向了同一个内存空间,所以当其中一个方法改变栈内存中的值时,两个方法中的值都会发生变化
package test;
import java.lang.reflect.Field;
/**
* @author miao
* @date 2020/8/1
*/
public class Test {
void methodA(){
Integer integer = 10;
System.out.println("方法A修改前:" + integer);
// 调用methodB方法
methodB(integer);
System.out.println("方法A修改后:" + integer);
}
/*
* 被调用的方法
*/
void methodB(Integer integer) {
System.out.println("方法B修改前:" + integer);
// 因为Integer是final修饰的,所以我们用反射强行修改它的值为1
try {
Class<? extends Integer> clazz = integer.getClass();
Field value = clazz.getDeclaredField("value");
value.setAccessible(true);
value.set(integer, 1);
} catch (Exception e) {
}
System.out.println("方法B修改后:" + integer);
}
public static void main(String[] args){
Test t = new Test();
t.methodA();
}
}
运行结果:
可以看到,方法A没有操作integer的值,但是它的值依然被修改了。
刚开始写java的博客,本着学习的态度和大家分享,有什么不足或对java知识理解错误的地方请大家指出,共同交流学习和进步。