2.在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by value)。Java中没有传引用(pass by reference)的概念。
public class ParamTest
{
public void changePoint(Point point)
{
point.x = 3;
point.y = 4;
}
public static void main(String[] args)
{
ParamTest pt = new ParamTest();
Point point = new Point();
pt.changePoint(point);
System.out.println(point.x);
System.out.println(point.y);
}
}
class Point
{
int x; //横坐标
int y; //纵坐标
}
执行结果:
D:\src>java ParamTest
3
4
【原因如下】:main方法执行Point point = new Point();时候在内存中生成一个对象里面存放X=0;Y=0初始值,同时该对象返回一个point引用(如图15-1黑色所示),这个引用时在main方法的时候生成的,当执行pt.changePoint(point);代码时候,调用changePoint方法,把point作为参数传递到这个函数中,此时在还没有执行方法体的时候,又生成了一个point的引用(如图15-1红色所示),相当于把这个main方法中的那个引用的地址赋值给change方法中的这个引用,所以同样指向main方法中生成的那个对象,此时执行方法体,将对象内容X=0;Y=0改为X=3;Y=4,修改放映到其他的引用中,执行完这个函数,change产生的引用销毁,打印出对象内容输出被修改的X和Y坐标。
图15-1
修改程序如下:
public class ParamTest
{
public void changePoint(Point point)
{
point = new Point();
point.x = 3;
point.y = 4;
}
public static void main(String[] args)
{
ParamTest pt = new ParamTest();
Point point = new Point();
pt.changePoint(point);
System.out.println(point.x);
System.out.println(point.y);
}
}
class Point
{
int x; //横坐标
int y; //纵坐标
}
执行结果:
D:\src>java ParamTest
0
0
【原因如下】:在程序执行point = new Point();与上一个程序执行情况相同,再执行完之后change方法中的point指向了新生成的对象,同时对其修改内容为X=3,Y=4;当方法执行完后,引用销毁。程序输出的坐标至始至终都是在main方法返回的引用所指向的对象内容中的,所以还是X=0,Y=0,没有被修改。如图15-2中所示。次程序可以结合中 http://blog.csdn.net/xukunhui2/article/details/8169989的程序例子一起研究。
图15-2
注意其中两个point的是不一样的,为了更加清晰的明白,将上面程序写成这样,同时如图15-3所示这样会更加直观明白。
修改程序如下:
public class ParamTest
{
public void changePoint(Point p)
{
p = new Point();
p.x = 3;
p.y = 4;
}
public static void main(String[] args)
{
ParamTest pt = new ParamTest();
Point point = new Point();
pt.changePoint(point);
System.out.println(point.x);
System.out.println(point.y);
}
}
class Point
{
int x; //横坐标
int y; //纵坐标
}
执行结果:D:\src>java ParamTest
0
0
图15-3
继续看下一个程序:
public class ParamTest2
{
public static void main(String[] args)
{
C c = new C();
int a = 1;
c.changeInt(a);
System.out.println(a);
}
}
class C
{
void changeInt(int a)
{
a++;
}
}
执行结果:
D:\src\Lesson 1>java ParamTest2
1
【原因如下】:传递的int类型的原生数据类型数据,只是赋值过去,赋完值之后,你自己运算,我还是我不变。
多说一句:执行方法的过程就是压栈,处理,弹出的过程,数据压入栈中,处理,再弹出是一个先入先出的过程。