程序中的赋值和参数传递,一种比较普遍的说法是包括2种类型:passing by value 和 passing by reference。其实个人觉得不必太纠结这个概念,
对于Java来说,是没有passing by reference的说法的。可以将其看做是
原生数据类型(Primitive)
的传递和
引用数据类型(Object)
传递,而无论传递原生数据类型还是引用类型,统一都是
传值
。原生数据类型的传递是将堆栈里面的值直接复制一份传递,引用类型是将堆栈中对象引用的地址值复制一份传递。
举个例子来看
public class ParamTest1
{
public static void main (String[] args)
{
C c = new C();
int a =1;
c.changeInt(a);
System.out.println(a);
}
}
class C
{
void changInt(int a)
{
a++;
}
}
输出是1
因为原生数据传递,不是引用传递,跟地址无关,我只是把自己的值传给了你,但是传完以后就完了,你是你,我是我,你要怎么变都可以,但是跟我无关,所以我的值还是原来的值。说白了,其实就是原生数据并不是指向型的,直接在栈空间里面赋值,对自身也没有任何影响。别的数据尽管改变,但是并不会影响自己的数据。
public class ParamTest2
{
public void changePoint(Point point)
{
point.x=3;
point.y=4;
}
public static void main(String[] args)
{
ParamTest2 pt=new ParamTest2();
Ponit point= new Point();
pt.changePoint(point);
System.out.println(point.x,point.y);
}
}
class Point
{
int x;
int y;
}
输出结果为 3,4
如果在changePoint里面第一行加一句 point=new Point();
那么输出的结果就变成了0,0
{
public static void main (String[] args)
{
C c = new C();
int a =1;
c.changeInt(a);
System.out.println(a);
}
}
class C
{
void changInt(int a)
{
a++;
}
}
输出是1
因为原生数据传递,不是引用传递,跟地址无关,我只是把自己的值传给了你,但是传完以后就完了,你是你,我是我,你要怎么变都可以,但是跟我无关,所以我的值还是原来的值。说白了,其实就是原生数据并不是指向型的,直接在栈空间里面赋值,对自身也没有任何影响。别的数据尽管改变,但是并不会影响自己的数据。
public class ParamTest2
{
public void changePoint(Point point)
{
point.x=3;
point.y=4;
}
public static void main(String[] args)
{
ParamTest2 pt=new ParamTest2();
Ponit point= new Point();
pt.changePoint(point);
System.out.println(point.x,point.y);
}
}
class Point
{
int x;
int y;
}
输出结果为 3,4
如果在changePoint里面第一行加一句 point=new Point();
那么输出的结果就变成了0,0
对象引用传递其实也是传值,只不过传递的是地址的值,因为引用具有指向性,所以2个引用存储的地址值一样的话就会指向同一个对象,任何一个改变其中的值,另一个会受到影响。