警告:不要编写返回引用可变对象的访问器方法如下:
private Date hireDay;
public Date getHireDay() {
return hireDay;
}
public void setHireDay(Date hireDay) {
this.hireDay = hireDay;
}
Date类有一个更改器方法setTime,Date对象是可变的,这点破坏了封装性
出错的原因很微妙。date和harry.hireDay引用同一个对象。对date调用更改器方法就可以自动的改变这个人的私有状态
看图
基于类的访问权限
从前面已经知道方法可以访问调用对象的私有数据。
看下面一个例子
package classLearn;
import java.time.LocalDate;
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
private int age;
Employee(String n, double s, int year, int month, int day){
this.name = n;
this.salary = s;
this.hireDay = LocalDate.of(year, month, day);
}
Employee(String n, double s, int year, int month, String day){
}
Employee(){
}
Employee(String n){
}
public String getName() {
return "青城博雅职工:" + name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void setHireDay(LocalDate hireDay) {
this.hireDay = hireDay;
}
@Override
public String toString() {
return "Employee [name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + "]";
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 0) {
age = 0;
}
this.age = age;
}
public void addSalary(int addPart) {
salary = getNewSalary(addPart);
}
private double getNewSalary(int addPart) {
return salary * (100 + addPart)/100;
}
/*
* 包含类可以直接访问私有域
*/
public boolean equels(Employee ee) {
return name.equals(ee.name);
}
}
这个例子说明一个方法可以访问所属类的所有对象