方法(可变参数,参数绑定)面对面编程基础

可变参数
可变参数是用“类型...”定义,相当于数组类型:

class Group {
    private String[] names;

    public void setNames(String... names) {
        this.names = names;
    }
}

上面代码,就是定义了一个名为setNames的可变参数
下面是调用可变参数的方法

Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames(); // 传入0个String

也有第二个方法定义可变参数,但是调用方法就会麻烦一些

class Group {
    private String[] names;

    public void setNames(String[] names) {
        this.names = names;
    }
}

麻烦在这里,调用时需要自己先构造String[]

Group g = new Group();
g.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao Jun"}); // 传入1个String[]

参数绑定
What?调用方把参数传给实例方法时,调用时传递的值会按调用位置一一绑定
先看一组基本类型参数的传递

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        int n = 15; //n的值为15
        p.setAge(n); 
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改为20
        System.out.println(p.getAge()); // 15还是20?
    }
}

class Person {
    private int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

运行代码结果显示,修改外部的局部变量n,不影响实例p的age字段。
原因是setAge()方法获得的参数,复制了n的值,因此,p.age和局部变量n互不影响。

现在看一个传递引用参数的例子

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String[] fullname = new String[] { "Homer", "Simpson" };//使用了上面介绍的第二种定义可变参数的方法
        p.setName(fullname); 
        System.out.println(p.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
    }
}

class Person {
    private String[] name;

    public String getName() {
        return this.name[0] + " " + this.name[1];
    }

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

注意到setName()的参数现在是一个数组。
一开始,把fullname数组传进去,然后,修改fullname数组的内容,结果发现,实例p的字段p.name也被修改了!

posted on 2026-08-15 15:24  aaa竹一  阅读(0)  评论(0)    收藏  举报

导航