Java 中关于值传递的示例说明
还是先说总结吧。
Java 中只有值传递,没有引用传递。
下面我用一些代码示例进行验证及说明:
public static void main(String[] args) { int a=1; int b=2; exchange(a,b); //交换a,b的值 System.out.println("a的值为:"+a); System.out.println("b的值为:"+b); } private static void exchange(int c, int d){ int temp=c; c=d; d=temp; System.out.println("c的值为:"+c); System.out.println("d的值为:"+d); }
输出结果为:
c的值为:2 d的值为:1 a的值为:1 b的值为:2
说明:exchange()方法的作用是交换c和d的值,在main()方法中调用exchange()方法时,传的参数值为a和b,但实际传到exchange()方法时,c和d接收的值是a和b的复制值,所以无论c和d怎样交换,都不会影响到main()方法中a和b的值。
Java中的数据类型分为基本数据类型和引用数据类型。
基本数据类型包括 byte,short,int,long,float,double,char 和 boolean 8种,当基本数据类型发生值传递情况时,实际传递的是基本数据类型的复制值,复制的值发生变化,不会影响原本的值。
下面是其他基本数据类型发生值传递情况的示例:
public static void main(String[] args) { char a='*'; short b=1; float c=4f; boolean d=true; test(a,b,c,d); System.out.println("a的值为:"+a); System.out.println("b的值为:"+b); System.out.println("c的值为:"+c); System.out.println("d的值为:"+d); } private static void test(char a, short b, float c, boolean d){ a='#'; b=11; c=44f; d=false; System.out.println("基本数据类型a的值为:"+a); System.out.println("基本数据类型b的值为:"+b); System.out.println("基本数据类型c的值为:"+c); System.out.println("基本数据类型d的值为:"+d); }
运行结果:
基本数据类型a的值为:# 基本数据类型b的值为:11 基本数据类型c的值为:44.0 基本数据类型d的值为:false a的值为:* b的值为:1 c的值为:4.0 d的值为:true
上面我介绍了一下基本数据类型发生值传递的情况,那么引用数据类型发生值传递时又会发生什么呢?
我们还是先用代码看一下实际的发生情况吧
public static void main(String[] args) { int [] arr={1,2,3,4,5}; System.out.println("初始值:"+arr[0]); test(arr); System.out.println("后期值:"+arr[0]); } private static void test(int [] array){ array[0]=999; System.out.println("处理值:"+array[0]); }
运行代码
初始值:1 处理值:999 后期值:999
我们可以从结果发现,数组中的数据已经发生了改变。
说明:
array 接收到的值也是 arr 的拷贝,不过arr是引用数据类型,所以拷贝的不是其本身的值,而是其地址值,在 test() 方法中,根据地址值找出实际存储的值,然后改变了数组的第一个值,在main()方法中, 根据地址值查找实际存储的值,其本身也已经被改变了。
再看一个例子吧
public class Student { private String name; public Student(String name){ this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public static void main(String[] args) { Student student = new Student("张三"); test(student); System.out.println(student.getName()); } private static void test(Student s){ System.out.println(s.getName()); s.setName("李四"); System.out.println(s.getName()); }
输出结果:
张三
李四
李四

浙公网安备 33010602011771号