java传值与传引用总结

基本数据类型

public class ParamTest {
    public static void main(String[] arge) {
	 	double percent = 10;
		System.out.println("Testing tripleValue:");
     	System.out.println("Before: percent="+ percent);
     	tripleValue(percent);
     	System.out.println("After: percent=" +percent);
	}
    public static void tripleValue(double x){
        x = x * 3;
        System.out.println("End of method x=" + x);
    }
}

运行结果是

Testing tripleValue:
Before: percent=10.0
End of method x=30.0
After: percent=10.0

我们可以发现percent的值没有改变,下面看一下具体的执行过程

  • x被初始化为percent值的一个拷贝
  • x乘以3变成30,此时percent仍然是10
  • 方法结束,参数x不再使用

我们可以得出一个结论就是一个方法不能修改一个基本数据类型的参数

对象参数

	public class ParamTest {
    public static void main(String[] arge) {
        System.out.println("Testing tripleSalary:");
        Employee harry = new Employee("Harry", 50000);
        System.out.println("Before: salary=" + harry.getSalary());
        tripleSalary(harry);
        System.out.println("After: salary=" + harry.getSalary());
    }

    public static void tripleSalary(Employee x){
        x.raiseSalary(200);
        System.out.println("End of method: salary=" + x.getSalary());
    }

}

class Employee{
    private String name;
    private double salary;

    public Employee(String n,double s){
        name = n;
        salary = s;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public void raiseSalary(double byPercent){
        double raise = salary * byPercent / 100;
        salary += raise;
    }

}

运行结果
Testing tripleSalary:
Before: salary=50000.0
End of method: salary=150000.0
After: salary=150000.0

我们可以发现salary数值发生了改变,下面看一下执行过程

  • x被初始化为harry值的拷贝,这里是一个对象引用
  • 调用raiseSalary方法,x和harry变成150000
  • 方法结束后,参数x不再使用

我们可以得出一个结论就是一个方法可以改变一个对象参数的状态

对象引用

public class ParamTest {
    public static void main(String[] arge) {
        System.out.println("Testing swap:");
        Employee a = new Employee("Alice",70000);
        Employee b = new Employee("Bob",60000);
        System.out.println("Before: a="+ a.getName());
        System.out.println("Before: b="+ b.getName());
        swap(a,b);
        System.out.println("After: a=" + a.getName());
        System.out.println("After: b=" + b.getName());

    }

    public  static  void swap(Employee x,Employee y){
        Employee temp = x;
        x = y;
        y = temp;
        System.out.println("End of method: x=" + x.getName());
        System.out.println("End of method: y=" + y.getName());
    }

}

运行结果是
Testing swap:
Before: a=Alice
Before: b=Bob
End of method: x=Bob
End of method: y=Alice
After: a=Alice
After: b=Bob

我们可以得出一个结论就是一个方法不能让对象参数引用一个新的对象

posted @ 2017-10-27 16:36  清水jx  阅读(397)  评论(0编辑  收藏  举报