Java面向对象的3个基本特征:封装,继承和多态
什么是封装?
也称数据隐藏,从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式,即给对象赋予“黑盒”特性。
关键在于,绝对不能让类中的方法直接访问到其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。
在Java中实现封装的做法是:
- 使用private修饰实例字段
- 对外提供get和set方法访问private实例字段
封装能带来什么好处?
“高内聚,低耦合”是程序设计中很重要的基本原则,封装就很好地体现出了这个原则。
- 让程序更加“面向对象”:因为只能通过对象的get和set方法才能访问和修改数据,没有对象就无法做到
- 提升程序的安全性/可靠性:只有通过set方法才能修改数据,我们可以在set方法中加上必要的判断,例如年龄不能小于0,避免数据被恶意篡改
- 提升程序的重用性:想象一下,加入实例字段是public的,我们使用user.age就可以访问和修改age字段,那么如果我们想为age加一个if判断条件,就要在每一处user.age都加上if语句,如果我们有1000个位置使用呢?这时候就体现出通过set方法修改age的好处了:只需在set方法里加上一个if语句即可。
设计get方法的注意点
不要返回可变对象引用,如果一定需要,首先应该对它进行克隆
例如:
错误用法
class Emp{
private Date hireDay;
...
public Date getHireDay(){
return hireDay;
}
}
Date对象是可变的,通过get方法拿到hireDay的引用后,在外部就可以修改,而不需要通过set方法,这一点就破坏了封装性!
正确用法
class Emp{
private Date hireDay;
...
public Date getHireDay(){
return (Date)hireDay.clone();
}
}