前言
所谓Java三大特性就是我们耳熟能详的 封装,继承,多态,那么他们各有什么好处呢。
封装
封装通俗解释就是信息隐藏或者数据访问保护。Java类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。我们通过一个简单的例子来解释一下。
public class FoodCard {
private Long cardId;
private BigDecimal balance;
private Long createTime;
private Long recentUseTime;
public FoodCard() {
this.cardId = IdGenerator.getInstance().generate();
this.createTime = System.currentTimeMillis();
this.recentUseTime = System.currentTimeMillis();
this.balance = BigDecimal.valueOf(0L);
}
public void addMoney( BigDecimal balance ) throws Exception {
if(balance.compareTo(BigDecimal.valueOf(0L))<0){
throw new Exception("amount error");
}
this.balance.add(balance);
this.recentUseTime = System.currentTimeMillis();
}
public void use( BigDecimal balance ) throws Exception {
if(balance.compareTo(BigDecimal.ZERO)<0){
throw new Exception("amount error");
}
if(balance.compareTo(this.balance)>0){
throw new Exception("amount error");
}
this.balance.subtract(balance);
this.recentUseTime = System.currentTimeMillis();
}
public Long getCardId() {
return cardId;
}
public BigDecimal getBalance() {
return balance;
}
public Long getCreateTime() {
return createTime;
}
}
上面的饭卡类中,总共四个属性,分别是饭卡id,饭卡余额,饭卡创建时间,饭卡最近使用时间。 我们正是使用了封装的隐藏特性,将饭卡ID,创建时间,使用时间进行了隐藏。因为饭卡id和创建时间在创建之后就不能再改,所以没有暴漏这两个属性的setter方法。而金额和最近时间是绑定在一起的,金额只有充值和使用两种用途,所以这里只提供了这两个方法。
这样就保证了数据的安全性,在使用这个类的时候别人就只能使用提供的这几个方法。如果全部提供了setter方法,不熟悉类实现的人可能会直接setter了金额,或者setter了最近使用时间,甚至卡号等数据,出现对象的数据不一致等问题。
好处:
1、数据安全性,属性不能被随便修改。
2、易用性,使用这个类的人可以清晰的使用这个类。***
原则:优雅的封装不能乱暴漏getter,setter方法。
继承
封装是基础,因为有了封装,为了实现代码的复用,所有就有了继承的属性。所谓继承就是子类拥有父类的非私有属性和方法。
好处:
1、提高代码复用
2、更切合实际生活容易理解。
坏处:
过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差
修改父类会直接影响子类的功能,违反开闭原则
原则:多用组合少用继承
多态
对于多态,继承就是基础,继承满足了代码复用,为了同时具备扩展能力,所以有了多态属性。所谓多态就是在继承的基础上通过重写父类方法来实现扩展。
好处:
1、提高代码复用
2、实现能力扩展,是很多设计模式,接口,抽象类的基础。