定义方法
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
的值互不影响。
结论:基本类型参数传递,是调用方值的复制。双方后续各自的修改不对其另外一方造成影响。
引用类型参数绑定
结论:引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。