java值传递

1. 什么是值传递和引用传递?

见链接:
https://www.nowcoder.com/questionTerminal/b296e9e1c40542ec8677c1e452b6b576
public void add(int a) { int b = a; }
这个可以看作是值传递,a是基本数据类型,他把他的值传给了b,
public void add(Object obj) { Object objTest = obj; }
这个可以看作是地址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest. 这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。
如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值。
java中传递,如果两个引用数据类型对应的值相等,他们会共用一个地址直到其中一个发生改变,创建新的地址。

牛客网的一道题:

class Value{
public int i=15;
}
public class Test{
public static void main(String argv[]){
Test t=new Test( );
t.first( );
}

public void first( ){
int i=5;
Value v=new Value( );
v.i=25;
second(v,i);
System.out.println(v.i);
}

public void second(Value v,int i){
i = 0;
v.i = 20;
Value val = new Value( );
v = val;
System.out.println(v.i+" "+i);
}
}
在这里插入图片描述

进入Test类,首先创建一个t的地址,执行t.first方法,在first中,会根据语句创建新的i的值(在栈中),定义v,会先赋初值v.i=15,然后变化成25.执行second方法,在second中,因为基本数据类型i在栈中,变化直接变化,而引用数据类型变化的是地址,指向的是堆中的对象(这个才是引用数据类型对应的值)所以这个v.i相当于同一地址指向了同一值,值发生了改变。v.i=20,后面实例化了val,val的val;i为15,v=val重新给v赋值,所以这里输出的v.i为15,(形参实参虽然地址相同,指向相同,但是一个变化不影响另一个的变化)并且地址不再与首次的v相同,i的值为0,出来继续打印的是实参v.i为20;

关于字符串和数组的传递

在这里插入图片描述

数组的话修改值会直接影响堆,字符串修改会影响地址的指向,注意形参和实参修改之前可能指向同一个对象,修改之后就不一定了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值