public、private
我们平时都会将对象的属性定义为private,然后编写相应的public的接口使得外部可以间接访问这些属性。
外部只需要获取返回结果,不需要关心内部如何实现处理逻辑,为了业务逻辑清晰,我们可以把部分逻辑代码拆成单独的private方法仅供内部调用。
public
一个class可以包含多个属性,例如,我们给Person类就定义了两个属性:
class Person {
public String name;
public int age;
}
但是,用public修饰属性暴露给外部可能会破坏封装性。比如,代码可以这样写:
Person ming = new Person();
ming.name = "Xiao Ming";
ming.age = -99; // age设置为负数
private
1)private修饰属性
显然,直接操作属性,容易造成逻辑混乱。为了避免外部代码直接去访问属性,我们可以用private修饰属性来拒绝外部直接访问,然后编写对外开放的访问接口。
class Person {
private String name;
private int age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
if (age < 0 || age > 100) {
throw new IllegalArgumentException("invalid age value");
}
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person ming = new Person();
ming.setName("Xiao Ming"); // 设置name
ming.setAge(12); // 设置age
System.out.println(ming.getName() + ", " + ming.getAge());
}
}
2)private修饰方法
为了业务逻辑清晰,我们可以把部分逻辑代码拆成单独的private方法仅供内部调用,如上代码可以改写为下面程序。
class Person {
private String name;
private int age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
Boolean valid = check(age);
if ( valid == false) {
throw new IllegalArgumentException("invalid age value");
}
this.age = age;
}
private boolean check(int age){
if (age < 0 || age > 100) {
return false;
}
return true;
}
}
public class Hello {
public static void main(String[] args) {
Person ming = new Person();
ming.setName("Xiao Ming"); // 设置name
ming.setAge(12); // 设置age
System.out.println(ming.getName() + ", " + ming.getAge());
}
}
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!