定义方法

public void SetName(String name) {
    if(name == null || name.isBlank()){
        throw new IllegalArgumentException("invalid name");
    }
    this.name = name.strip();//去掉首尾空格
}

外部代码不能直接读取 private 字段,但可以通过方法间接获取private字段的值。所以一个类通过定义方法

可变参数

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

class Group {
    private String [] names;

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

上面的setNames()就定义了一个可变参数。调用时,可以这么写:

var group = new Group();
group.setNames();//不传string
group.setNames("zhangge"); //传入一个string
group.setNames("zhanggee","guoyancha");//传入多个

完全可以把可变参数改写成String[]类型:

class Group {
    private String[] names;
    public void steNames(String[] names) {
        this.names = names;
    }
}

使用时需要自己先构造String[]

参数绑定

基本类型参数绑定

调用方把参数传递给实例方法时,调用时传递的值会按照参数位置一一绑定。

public class Main{
    public static void main(String[] args){
        var p = new Person();
        int n = 20;
        p.setAge(n);
        System.out.println(p.getAge);
        n = 30;
        System.out.println(p.getAge);
    }
}
class Person {
    private int age;
    public int getAge() {
        return this.age;
    }
    public void setAge() {
        this.age = age;
    }
}

//运行代码发现修改局部变量n的值,不影响实例中age字段的值。因为setAge()方法获得了参数,复制了n的值,因此p.age的值和局部变量n
的值互不影响。
结论:基本类型参数传递,是调用方值的复制。双方后续各自的修改不对其另外一方造成影响。

引用类型参数绑定

结论:引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。