Java中,有7种基本类型,当他们作为参数传递的时候,属于值传递,也就是说传递完成后,在方法中的参数与原函数中的变量是没有任何关系的.
而String和其他类型的对象,如果进行传参,则属于引用传递,引用传递的时候,实质上是将该对象的引用传递进去,方法中的对象和原函数中的对象其实是不同的,只是引用相同而已
现有代码如下:
public class Money {
private int x;
Money(int a){
this.x=a;
}
public void normalAdd(int x){
x++;
}
public void moneyAdd(Money money){
money.x++;
}
public void moneyNew(Money money){
money=new Money(100);
}
public static void main(String args[]) {
Money money=new Money(10);
int a=10;
money.normalAdd(a);
System.out.println(a);
money.moneyAdd(money);
System.out.println(money.x);
money.moneyNew(money);
System.out.println(money.x);
}
}
输出结果为
10
11
11
第一种情况,值传递
结果等于10,因为方法中对x进行操作并不会影响到main方法中的a
第二种情况:引用传递
将money对象传递到方法中,复制了引用给方法中的变量money,虽然方法和主函数中的对象都叫money,但实际上他们是不同的两个对象,只是引用相同而已.由于方法中的money对其属性进行了+的操作,所以会对主函数中的money对象产生影响(同一引用)
第三种情况:引用传递
第三种情况和第二种情况相似,但是返回值是11而不是100,为什么呢?最关键的一点在于二者只是引用相同而已,并没有其他联系.所以在方法中money=new Money(100),这样将方法中的money对象指向了一个新的money对象,当方法执行完毕时,这个对象的作用域也就到此为止了,gc会将其内存空间回收,销毁对象.所以在主函数中的对象指向的还是money.x=11的这一个对象.
所以,综上所述:
Java中,基本类型的传递属于值传递
引用类型的传递属于引用传递,但传递的是对象的引用,在方法中的对象和在方法外的对象是除了引用以外不同的两个对象.故能否产生影响要看其是否对同一引用进行了操作.