一个class可以包含多个field,但是直接把field用public暴露给外部可能会破坏封装性。
class Person {
public String name;
public int age;
}
Person ming = new Person();
ming.name = "Xiao Ming";
ming.age = -99; // 设置age为负数,显然不合理
直接 *** 作field,容易造成逻辑混乱,为了避免外部代码直接去访问field,可以使用private修饰field,拒绝外部访问。这时候就需要使用方法(method)来让外部代码可以间接修改field。
class Person {
private String name;
private int age;
public String getName() { // 获取name值
return this.name;
}
public void setName(String name) { // 设置name值
if (name == null || name.isblank()) {
// 显示抛出异常
throw new IllegalArgumentException("invalid name");
}
this.name = name.strip(); // 去掉首尾空格
}
public int getAge() { // 获取age值
return this.age;
}
public void setAge(int age) { // 设置age值
// 校验age值,小于0或大于100抛出异常
if (age < 0 || age >100) {
throw new IllegalArgumentException("invalid age value");
}
this.age = age;
}
}
Person ming = new Person();
ming.setName("Xiao Ming"); // 设置name
ming.setAge("18");
System.out.println(ming.getName() + ", " + ming.getAge());
虽然外部代码不能直接修改private字段,但是,外部代码可以调用方法setName()和setAge()来间接修改private字段。
在方法内部,我们就有机会检查参数对不对,如:setAge()就会检查传入的参数,参数超出了范围直接报错,这样,外部代码就没有任何机会把age设置成不合理的值。
一个类通过定义方法,就可以给外部代码暴露一些 *** 作的接口,同时,内部自己保证逻辑一致性。
调用方法语句是 " 实例变量名.方法名(参数); ",一个方法调用就是一个语句,所以不要忘了在末尾加 ';'分号。
2、定义方法定义方法的语法:
修饰符 方法返回类型 方法名(方法参数列表) {
// 若干方法语句
return 方法返回值;
}
方法返回值通过return语句实现,如果没有返回值,返回类型设置为void,可以省略return。
(1)private方法
private方法和private字段一样,不允许外部调用,但内部方法是可以调用private方法的。
class Person {
private String name;
private int birth;
public void setBirth(int birth) {
this.birth = birth; // 设置出生日期
}
public int getAge() {
return calcAge(2022); //调用private方法
}
// 定义private方法
private int calcAge(int currentYear) {
return currentYear - this.birth; // 计算年龄
}
}
Person ming = new Person();
ming.setBirth(2008);
System.out.println(ming.getAge()); // 获取年龄:2022-2008
// 输出结果:14
Person类并没有定义age字段,获取age时,通过方法getAge()返回的是一个实时计算的值,并非存储在某个字段的值。这说明方法可以封装一个类的对外接口,调用方不需要知道也不用关心Person实例在内部到底没有没age字段。
3、this变量在方法内部,可以使用一个隐含的变量this,它始终指向当前实例。
因此,通过"this.字段名"就可以访问当前实例的字段,如果没有命名冲突,可以省略this。
但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this。
class Person {
private String name;
public String getName(){
return name; // 相当于this.name
}
public void setName(String name){
this.name = name; // 前面的this不可少,少了就变成局部变量name了
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)