java本质上只有值传递,没有引用传递
java中我们说的引用传递只是把地址当作值传递给了另一个变量,然后这个变量根据这个地址值在栈中对对象的属性值进行修改,看个例子:
public class JavaTest {
public static void main(String[] args) {
JavaTest javaTest = new JavaTest();
javaTest.first();
}
public void first(){
int i = 5;
Num num = new Num();
num.i = 25;
second(num,i);
System.out.println(num.i);
}
public void second(Num num1,int i){
i = 0;
num1.i = 20;
Num num2 = new Num();
num1 = num2;
System.out.println(num1.i + " " + i);
}
}
class Num{
int i = 15;
}
这个题的输出结果是
15 0
20
先看这一步
public void first(){
int i = 5;
Num num = new Num();
num.i = 25;
second(num,i);
System.out.println(num.i);
}
首先new了一个Num对象(Num num = new Num();)
然后通过num中存储的地址,在栈中找到对应的i进行了更改(num.i = 25;)
调用second方法并带入参数(second(num1,i);)
ps:方法区就不画了,主要说传递问题
public void second(Num num1,int i){
i = 0;
num1.i = 20;
Num num2 = new Num();
num1 = num2;
System.out.println(num1.i + " " + i);
}
这时候num1中地址和num中的地址相同,但堆中num这个变量依然存在,i也一样,只不过在second中定义的i初始值就是传过来的值
ps:之前忘了画i了,现在补上
下面进入second方法
i = 0;
num1.i = 20;
Num num2 = new Num();
num1 = num2;
这时新建了一个num2,并将num2的地址赋值给了num1,num中的地址值没有变化
这个时候打印
System.out.println(num1.i + " " + i);
根据图我们都可看出num1.i=15,i=0
second方法结束,该出栈的出栈
回到方法first
public void first(){
int i = 5;
Num num = new Num();
num.i = 25;
second(num,i);
System.out.println(num.i);//此时该执行这句
}
基本类型不一定直接存在栈中,这么画只是为了好理解这道题,详情请看https://blog.csdn.net/qq_37272886/article/details/112316160