java-函数传参

函数传参

函数传递参数的方式有两种

按值传参,函数接收的是调用者提供的值

按引用传参,函数接收到的是调用者提供的变量地址

函数传参流程

那么java是按什么方式传参呢?答案是采用按值传参,函数的形参得到的是实参值的一份拷贝。

传递的参数为基本数据类型

 1 public class Test {
 2     public static void doubleValue(int num) {
 3         num = num * 2;
 4     }
 5     
 6     public static void main(String[] args) {
 7         int x = 1;
 8         doubleValue(x);
 9         System.out.println(x); //1
10     }
11 }

执行过程

(1)调用函数doubleValue(x)时,num被初始化为x值的一份拷贝,即num=1;

(2)在函数体内,num乘以2以后等于2,但是x还是1;

(3)函数执行结束后,变量num不再使用。

 传递的参数为引用类型

 1 package ja.see.models;
 2 
 3 class Employee {
 4     private double salary;
 5     
 6     public Employee(double salary) {
 7         this.salary = salary;
 8     }
 9     
10     public double getSalary() {
11         return salary;
12     }
13 
14     public void setSalary(double salary) {
15         this.salary = salary;
16     }
17 
18     public void doubleSalary(double salary) {
19         this.salary = 2 * salary;
20     }
21 }
22 
23 public class Test {
24     public static void increaseSalary(Employee e) {
25         e.doubleSalary(e.getSalary());
26     }
27     
28     public static void main(String[] args) {
29         Employee e1 = new Employee(3000.00);
30         System.out.println("After method: " + e1.getSalary());
31         increaseSalary(e1);
32         System.out.println("After method: " + e1.getSalary());
33     }
34 }

执行过程

(1)函数increaseSalary执行时,e被初始化为e1值的拷贝即Employee对象引用的一份拷贝,e与e1引用同一个对象

(2)在函数体内,操作这个对象的引用,e与e1同时引用的对象薪水乘以2

(3)函数执行结束后,变量e不再使用,变量e1继续引用那个薪水被修改为2倍的Employee对象实例

举例反证

上面的这个栗子,如果建立在java函数传参是引用传参的观点上也是成立的,所以下面我们来举例证明java函数传参是按值传参。

package com.java.se;

class Employee {
    private String name;
    
    public Employee(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

public class Test {
    public static void sayName(Employee e) {
        e = new Employee("tom");
    }
    
    public static void main(String[] args) {
        Employee e1 = new Employee("lily");
        System.out.println("Before method: " + e1.getName()); //lily
        sayName(e1);
        System.out.println("After method: " + e1.getName()); //lily
    }
}

如果java函数是按引用传参,那么After Method后e1.getName()应该是tom而不是lily;

总结

(1)一个函数不能修改一个基本数据类型的实参(数值型和布尔型)

(2)一个函数可以改变一个对象实参的状态

(3)一个函数不能让一个对象实参去引用一个新的对象

参考资料:《JAVA核心技术》

猜你喜欢

转载自www.cnblogs.com/marton/p/11253250.html