java中的值传递和引用传递
Posted ellen413
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的值传递和引用传递相关的知识,希望对你有一定的参考价值。
java 参数,不管是原始类型还是引用类型,传递的都是参数的副本。
如果参数类型是原始类型,那么传递的参数是这个参数的一个副本,也就是这个原始参数的值。如果在函数中改变了副本的值,是不会改变原始的值。
如果参数类型是引用类型,那么传递的参数是这个引用参数的一个副本,两个引用同时指向同一个对象的值。如果在函数中没有改变副本的地址,而是改变了
地址的值,那么函数内的改变会影响传入的参数。而如果在函数中改变了副本的地址,如new 一个,那么副本指向一个新的地址,那么传入的参数还是指向原来的地址,
所有不会改变参数的值。而如果在函数中先改变了副本的值,而后又改变了副本的地址,如new 一个,那么副本指向一个新的地址,那么传入的参数还是指向原来的地址,
但是会改变参数的值。
demo1:
1 public class ValuePass { 2 3 private static int num = 5; 4 5 public static void changeValue(int n) { 6 7 n = n+2; 8 9 System.out.println("n="+n); 10 11 } 12 13 public static void main(String[] args) { 14 15 System.out.println("Before changeValue(), num="+ num); 16 17 changeValue(num); 18 19 System.out.println("After changeValue(), num="+ num); 20 21 } 22 23 }
demo2:
public class ReferencePass { public static void changeSalary(Employ e, double raiseSalary) { e.setSalary(e.getSalary() + raiseSalary); System.out.println("e.salary="+ e.getSalary()); } public static void changeSalary2(Employ e, double raiseSalary) { e.setSalary(e.getSalary() + raiseSalary); e.setSalary(e.getSalary()+1000); Employ ee = new Employ(); ee.setSalary(20000); e = ee; System.out.println("e.salary="+ e.getSalary()); System.out.println("ee.salary="+ ee.getSalary()); } public static void main(String[] args) { Employ e = new Employ(); e.setSalary(10000); System.out.println("Before method, e.getSalary()="+ e.getSalary()); changeSalary(e, 1500); System.out.println("After method, e.getSalary()="+ e.getSalary()); changeSalary2(e, 1500); System.out.println("After method, e.getSalary()="+ e.getSalary()); } } class Employ { private double salary; public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
以上是关于java中的值传递和引用传递的主要内容,如果未能解决你的问题,请参考以下文章