java中方法参数传递方式是按值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而自己本身不会受到任何影响。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
Java中的参数传递:分为值传递和引用传递但本质上,Java中只有值传递。引用传递,其实可以理解为传的是类似指针的东西。
值传递就是把基本变量的值拷贝一份,传递这个拷贝。引用传递则是传递的引用的地址,也就是该变量在内存空间的地址。
1.值传递
只有基本数据类型采用值传递,特点是传递的是值的拷贝,传递完后两者就没有关系了。也就是说方法内和方法外的值互不相干
基本数据类型:
·整型:int,long,byte,short
浮点型:float,double
字符型:char
布尔型:boolean
注:8种基本数据类型以外的数据类型都为引用类型。
2.引用传递
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。这里我们可以用内存分配示意图来体现
3.String类型传递
先说结论,String类型传递与基本数据类型的传递效果相似。
说明:
String类对象一旦创建,其内容不可更改:
String类的所有方法都不会改变String类对象内容,要改变String类对象的值就必须创建一个新的String对象。
也就是说,当进行参数传递时,如果方法内对String类对象的值进行了修改,那么实际上是创建了一个新的String类对象,然后让原来的变量指向它而已。但是这个“原来的变量”是一份拷贝副本,只是一开始创建的时候与主方法中的传递的值相同而已,现在改变之后,两者就毫无关系了。
结果是(p1[0,0], p2[5,5])就对了, 下图是执行流程以及内存变化
记住: 当对象的引用被执行赋值操作(=)后, 讲不在指向原来的对象(新的对象不是原来的对象)
// modify方法做如下修改就知道为什么是那样的结果了:private static void modify(Point p1,Point p2){
System.out.println(p2) // 注意观察hashcode值, 不要重写toString()方法
Point p = p1
p1 = p2
p2 = p
p1.setLocation(5, 5)
p2 = new Point(5, 5)
System.out.println(p2) // 这里p2与之前的p2的hashcode值已经不是同一份
}
// 修改main方法如下
public static void main(String[] args)
{
Point p1 = new Point(0,0)
Point p2 = new Point(0,0)
System.out.println(p2)
modify(p1, p2)
System.out.println(p2) // modify执行完成后, p2的指向并未改变
System.out.println(p1.getX()+","+p1.getY()+","+p2.getX()+","+p2.getY())
}
/**
* 可以使用断点调试观察modify方法中p2的指向变化
* Eclipse中引用被赋予新的值时, 调试界面中[变量列表]的变化为 黄色高亮显示
*/
希望对你有帮助!