Java——值传递与引用传递
1.基本类型和引用类型在内存中的保存
(1)基本类型的变量保存原始值,即它代表的值就是数值本身;
基本类型在声明变量时就为它分配了空间;
基本类型在参数传递过程中属于值传递,也就是复制一份数据到参数中。
(2)引用类型的变量保存引用值;
("引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。)
引用类型在参数传递过程中数据引用传递,也就是将内存地址传过去。
2.引用传递和值传递
(1)值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法
中的操作都是对形参这个值的修改,不影响实际参数的值。
(2)引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
1 public class Test { 2 public static void main(String[] args) { 3 Test t = new Test(); 4 int score = 59;//这里传递的参数score就是按值传递 5 6 Numbertest nt = new Numbertest(); 7 nt.num = 59;//这里传递的参数num就是引用传递 8 9 t.addNum(score); 10 System.out.println("3:"+score); 11 12 t.addNum(nt); 13 System.out.println("4:"+nt.num); 14 15 16 } 17 18 public void addNum(int score) { 19 score++; //1:60 20 // score=score++; //1:59 21 // score=score+1; 22 System.out.println("1:"+score); 23 } 24 25 public void addNum(Numbertest nt) { 26 nt.num++; 27 System.out.println("2:"+nt.num); 28 } 29 30 } 31 32 33 34 public class Numbertest { 35 36 public int num; 37 38 }
运行结果:
1:60
3:59
2:60
4:60
此代码运行的结果就是最好的一个例子;
在传递中也许还有更多的影响因素,随着学习的深入就会发现。