我们都知道,传值方式基本分两种:值传递和引用传递,那么在JAVA中到底是值传递还是引用传递呢?下面本篇文章就来给大家介绍一下,希望对大家有所帮助。
值传递:是指在调用函数时将实际参数复制一份传递给形参,这样在函数中对形参的修改将不会影响到实际参数的值。
引用传递:是指在调用函数时将实际参数的地址直接传递到形参,那么在函数中对参数所进行的修改,将会影响到实际参数的值。
java怎么传值?
java的传值方式:值传递(所有发生的变化只限制在方法体中,出了方法体,任何的修改操作都不再有效)。【推荐学习:java课程】
我们可以使用一段程序来验证Java中只有值传递
/** * 验证java中只有值传递 */class User{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; <p>本文来源gao!%daima.com搞$代*!码$网9</p> }}public class TestValue { public static void change(User user2,int a2){ System.out.println("改变之前:"+user2.getName()+",a2="+a2); user2.setName("李四"); //改变 user2 的 name 值 a2 = 10; //改变 a2 的值 System.out.println("改变之后:"+user2.getName()+",a2="+a2); user2 = new User(); //将 user2 重新指向一个新对象 user2.setName("王五"); System.out.println("重新指向一个新对象后:"+user2.getName()); } public static void main(String[] args){ User user1 = new User(); user1.setName("张三"); //初始化 user1 的 name 为张三 int a1 = 5; //初始化 a1 的值为 5 change(user1,a1); //调用方法验证传值方式 System.out.println("调用方法后:"+user1.getName()+",a1="+a1); }}
运行这段程序,输出结果为:
改变之前:张三,a2=5改变之后:李四,a2=10重新指向一个新对象后:王五调用方法后:李四,a1=5
结果分析
下面我们以上图为辅助,来分析这段程序,首先我们定义了一个User
类,然后在测试类中实例化了一个User
对象,名为user1
,并且为其赋值name = '张三'。
此时在内存中如图1
所示,实例化一个对象相当于在堆中开辟了一块内存,内存地址为017
,此时这个对象的引用为user1
,内存地址为001
,它保存了该对象在内存中的地址,也就是指向了该对象。
接下了,我们调用方法change()
,来尝试改变user1
的name
值以此验证java中的传值方式。
我们将user1
作为实参传给change()
方法,形参user2
来接受这个实参,在这里就体现出了两种传参方式的不同。如果是按值传递,那么就像定义的那样。
如图2
所示,user2
是user1
的一份副本,也就是说在传递参数时,将user1
(本身是一个对象的引用),复制了一份,名为user2
,它同样也是一个对象的引用,并且user1
和user2
此时指向同一个对象。