尚硅谷JavaSE基础

5.4.4 参数传递机制

1. 为什么要传参

有的方法在执行时, 需要用到一些值, 这些值在执行时必须要由调用者传递(告诉)给方法, 方法才可以正确执行

2. 传参的本质是什么

传参的本质是方法在调用时, 把实参的值赋值给形参(形参是局部变量), 也称为传值调用

3. 方法调用的内存结构

public class Person {

public void test2(int a) {

    System.out.println(“test2 a:” + a);

}

public int add(int a, int b) {

    System.out.println(“a + b”);

    int c = a + b;

    return c;

}

}

public class PersonTest {

public static void main(String[] args) { 

Person t = new Person();

        int a = 10;

        int b = 20;

        int c = t.add(a, b); // 通过值传递把a的值赋值给方法中的形参a

System.out.println(c); // 方法调用返回值也是赋值给c

}

}

注意 : 方法返回值30保存在一个临时空间中, 方法调用结束后返回给调用者后就消失.

5.4.5 可变参数

1. 什么是可变参数

当一个方法中的参数类型都相同, 但是个数不确定的情况下.

2.如何声明可变参数

//下面采用数组形参来定义方法

public void test(int a ,String[] books);

//以可变个数形参来定义方法

public void test(int a ,String…books);

注意 : 以上两个方法不可以共存.

public class VarArgs {

/*类中的方法的功能类似, 但是参数个数不确定

public int avg(int a, int b) {

return (a + b) / 2;

}

public int avg(int a, int b, int c) {

return (a + b + c) / 3;

}

public int avg(int a, int b, int c, int d) {

return (a + b + c + d) / 4;

}*/

// 可变参数, 参数的个数可以是任意个, 只能放在参数列表的最后

public int avg(String a, int... values) { // int...是数组, 同时又能兼容任意个数参数

int sum = 0;

for (int i = 0; i < values.length; i++) {

sum += values[i];

}

return sum / values.length;

}

}

3.可变参数的本质是什么

可变参数的本质上是方法在调用时, 实际传递的是数组.

public class VarArgsTest {

public static void main(String... args) {

VarArg va = new VarArg();

System.out.println(va.avg(2)); // 一个参数可以

System.out.println(va.avg()); // 不传参数也可以

System.out.println(va.avg(null)); // 传null也可以

System.out.println(va.avg(10, 20, 40, 50)); // 任意多个也可以

System.out.println(va.avg(10, 20, 40, 50,70, 80, 100, 5, 2, 3));

int[] arr = new int[]{2, 3, 4, 5};

System.out.println(va.avg(arr)); // 直接传数组也可以

System.out.println(va.avg(new int[]{10, 20})); // 编译器会自动做这件事,也可以手工创建数组

}

}