Java语言对对象采用的是引用传递还是按值传递?

  按值调用表示方法接收的是调用者提供的值;而按引用调用表示方法接收的是调用者提供的变量地址;一个方法可以修改传递引用所对应的变量值不能修改传递值调用所对应的变量值;

 

  Java语言对对象采用的是引用传递还是按值传递?下面举个例子说明;

public class ParamTest {

	public static void main(String[] args) {
		System.out.println("---测试1 tripleValue---");
		double percent = 10;
		System.out.println("Before percent:" + percent);
		tripleValue(percent);
		System.out.println("After percent:" + percent);
		
		
		System.out.println("---测试2 tripleSalary---");
		Employee harry =new Employee("Harry", 5000, 1);
		System.out.println("Before salary:" + harry.getSalary());
		tripleSalary(harry);
		System.out.println("After salary:" + harry.getSalary());
		
		System.out.println("---测试3 swap---");
		Employee emp1 =new Employee("Alice", 1000, 1);
		Employee emp2 =new Employee("Bob", 1000, 1);
		System.out.println("Before emp1:" + emp1);
		System.out.println("Before emp2:" + emp2);
		swap(emp1, emp2);
		System.out.println("After emp1:" + emp1);
		System.out.println("After emp2:" + emp2);
		
	}
	
    public static void swap(Employee e1, Employee e2) {
        Employee tmp = e1;
        e1 = e2;
        e2 = tmp;
    }
    
    public static void tripleSalary(Employee x) {
    	x.setSalary(200);
    	System.out.println("End of method salary:" +
    			x.getSalary());
    }

    public static void tripleValue(double x) {
    	x *= 3;
    	System.out.println("End of method x:" + x);
    }
    
}

  

  Employee实体类:

public class Employee {
    private String name;
    private double salary;
    private int id;

    public Employee(String name, double salary, int id) {
        this.name = name;
        this.salary = salary;
        this.id = id;
    }

    public Employee() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double byPercent) {
     double raise = this.salary * byPercent / 100; this.salary += raise; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", salary=" + salary + ", id=" + id + '}'; } }

  

  上面的测试代码的结果是:

---测试1 tripleValue---
Before percent:10.0
End of method x:30.0
After percent:10.0
---测试2 tripleSalary---
Before salary:5000.0
End of method salary:15000.0
After salary:15000.0
---测试3 swap---
Before emp1:Employee{name='Alice', salary=1000.0, id=1}
Before emp2:Employee{name='Bob', salary=1000.0, id=1}
After emp1:Employee{name='Alice', salary=1000.0, id=1}
After emp2:Employee{name='Bob', salary=1000.0, id=1}

  

  对于测试1,方法的参数为基本类型,一个方法试图将一个参数值增加至3倍,不过该方法调用后,percent的值还是10;它的执行过程(如下图):

    1 ) x 被初始化为 percent 值的一个拷贝;

    2) x被乘以 3后等于 30,但是percent仍然10

    3 ) 这个方法结束之后,参数变量 X再使用;

 

                      

   从测试1可以看出一个方法不可能修改一个基本数据类型的参数;

 

  

   对于测试2,方法的参数为对象的引用,具体的执行过程(如下图):

    1 ) X 被初始化为 harry 值的拷贝,这里是一个对象的引用;

    2 ) setSalary方法应用于这个对象引用,x harry 同时引用的那个 Employee 对象的salary;

    3 ) 方法结束后,参数变量x不再使用,但是对象变量harry继续引用那个雇员对象;

     

 

 

 

    对于测试3,swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这个变量的拷贝(如下图):

          

 

   通过上面的测试说明,Java语言对对象采用的按值传递,而不是引用传递;

    • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型);
    • 一个方法可以改变一个对象参数的状态;
    • 一个方法不能让对象参数引用一个新的对象; 

 

参考:《Java核心技术卷一基础知识》的第4章第5节

 

转载于:https://www.cnblogs.com/coder-zyc/p/10613677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值