参数的传递都是「值传递」,在调用方法的时候,参数会被创造出一个副本,原本的值是不会改变的。
基本数据类型,也称为「值类型」
- 基本数据类型的值传递
package demo1;
public class Demo9 {
public static void fun1(int i, int j) {
i = i + 5;
j = j + 5;
System.out.println("方法内输出" + i);
System.out.println("方法内输出" + j);
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("调用方法前a的值" + a);
System.out.println("调用方法前b的值" + b);
fun1(a,b);
System.out.println("调用方法后a的值" + a);
System.out.println("调用方法后b的值" + b);
}
}
最后输出结果:
调用方法前a的值10
调用方法前b的值20
方法内输出15
方法内输出25
调用方法后a的值10
调用方法后b的值20
分析:
1、main()方法顺序执行,当执行了 int a = 10; b = 20; 这两句代码后,程序在栈内存中开辟了两个空间,里边分别存放的值是10,20。如下图:
2、执行输出语句,此时输出的 a = 10,b = 20;
System.out.println("调用方法前a的值" + a);
System.out.println("调用方法前b的值" + b);
3、执行方法 fun1(),程序在栈内存中又开辟了两块空间,分别存放 a,b 的副本 a’ 与 b’,将 a,b 的值传递过去,执行 a’ = a’ + 5,b’ = b’ + 5,输出 a’,b’,内存模型如下图:
a , b 的值与 a’ 和 b’ 的值没有关联,不会受其影响。所以运行方法后再输出a,b的值时,其没有发生变化,仍然是10与20。
- 引用类型的值传递
package demo1;
public class Demo8 {
void fun1(int i, int j) {
i = i + 5;
j = j + 5;
System.out.println("fun1-i:" + i);
System.out.println("fun1-j:" + j);
}
void fun1(P p) {
p.i = p.i + 5;
p.j = p.j + 5;
System.out.println("fun1-p-i:" + p.i);
System.out.println("fun1-p-j:" + p.j);
}
public static void main(String[] args) {
Demo8 demo8 = new Demo8();
int i = 10;
int j = 20;
demo8.fun1(i,j);
System.out.println("main-i:" + i);
System.out.println("main-j:" + j);
System.out.println("===================");
P p = new P();
p.i = 10;
p.j = 20;
demo8.fun1(p);
System.out.println("main-p-i:" + p.i);
System.out.println("main-p-j:" + p.j);
}
}
class P {
int i;
int j;
}
最后输出结果:
fun1-i:15
fun1-j:25
main-i:10
main-j:20
===================
fun1-p-i:15
fun1-p-j:25
main-p-i:15
main-p-j:25
内存中的图形:
总结:
如果方法中传入的是基本数据类型,那么原变量的值是不会发生改变的,如果方法中传入的是引用数据类型(即类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。