Java方法传参:
在java中方法的参数传递为值传递。
给方法传值,其实是就是将实参数值的副本(内存中实参的一份复制)传入方法内,而参数本身不受到影响。
简单数据类型和复合数据类型都传递一份实参栈值的副本。
下面我们来看一个例子:
public class Demo
{
//更改这两个变量的值
public static void change(int i,int j)
{
int t = i;
i = j;
j = t;
System.out.println("改更后:i = "+ i +"\tj = "+j);
}
public static void change(Point p)
{
int t = p.x;
p.x = p.y;
p.y = t;
System.out.println("交换后:x = "+ p.x + "\ty=" + p.y);
}
public static void main(String args[])
{
int a=10,b=20;
Demo.change(a,b);//方法传参,传的是实参副本,不是实参本身
System.out.println("a = " + a + "\tb = "+b);
System.out.println("---------------------------------");
Point p=new Point(60,80);
p.info();
change(p);
p.info();
}
}
class Point
{
int x;
int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public void info()
{
System.out.println("x = "+x+"\ty = "+y);
}
}
运行结果截图:
从运行结果我们可以看出将a与b传给change方法后a与b的值并没有改变,但p中的x与y的值却改变了。
想知道为什么我们可以简单画一个该程序在JVM中的内存图解
我们知道基本数据类型直接在栈中开辟内存由上图可知,change交换了a1与b1的值但不会改变a与b的值;而对象(复杂)数据类型在堆中开辟内存因为p1是p的副本所以其指向堆中同一块内存,change方法对p1的操作改变了p1所指向内存中x与y的值所以p所指向内存中x与y的值也改变了。