1. 封装
是什么?
- 封装也叫作信息隐藏或者数据访问保护。
- 类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。
- 它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。
有什么用?
- 保护数据不被随意修改,提高代码的可维护性
- 仅暴露有限的必要接口,提高类的易用性
怎么用?
public class Wallet {
private String id;
private long createTime;
private BigDecimal balance;
private long balanceLastModifiedTime;
// ... 省略其他属性...
public Wallet() {
this.id = IdGenerator.getInstance().generate();
this.createTime = System.currentTimeMillis();
this.balance = BigDecimal.ZERO;
this.balanceLastModifiedTime = System.currentTimeMillis();
}
// 暴露获取属性的方法
public String getId() { return this.id; }
public long getCreateTime() { return this.createTime; }
public BigDecimal getBalance() { return this.balance; }
public long getBalanceLastModifiedTime() { return this.balanceLastModifiedTim; }
// 暴露修改的方法!!
// 不一定必须是set,这里就是increase 与 decrease
public void increaseBalance(BigDecimal increasedAmount) {
if (increasedAmount.compareTo(BigDecimal.ZERO) < 0) {
throw new InvalidAmountException("...");
} this.balance.add(increasedAmount);
this.balanceLastModifiedTime = System.currentTimeMillis();
}
public void decreaseBalance(BigDecimal decreasedAmount) {
if (decreasedAmount.compareTo(BigDecimal.ZERO) < 0) {
throw new InvalidAmountException("...");
}
if (decreasedAmount.compareTo(this.balance) > 0) {
throw new InsufficientAmountException("...");
}
this.balance.subtract(decreasedAmount);
this.balanceLastModifiedTime = System.currentTimeMillis();
}
}
2. 继承
是什么?
- 继承是用来表示类之间的 is-a 关系,比如猫是一种哺乳动物。
- 从继承关系上来讲,继承可以分为两种模式,单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类, 比如猫既是哺乳动物,又是爬行动物。
- 编程语言需要提供特殊的语法机制来支持,比如 Java 使用 extends 关键字来实现继承,C++ 使用冒号(class B : public A)。不过,有些编程语言只支持单继承,不支持多重继承,比 如 Java、PHP 等,而有些编程语言既支持单重继承,也支持多重继承,比如 C++、Python 等。
有什么用?
- 代码复用性。假如两个类有一些相同的属性和方法,我们就可以将这 些相同的部分,抽取到父类中,让两个子类继承父类。这样,两个子类就可以重用父类中的代码,避免代码重复写多遍。不过,这一点也并不是继承所独有的,我们也可以通过其他方 式来解决这个代码复用的问题,比如利用组合关系而不是继承关系。
- 若过度使用继承,继承层次过深过复杂,就会导 致代码可读性、可维护性变差。为了了解一个类的功能,我们不仅需要查看这个类的代码, 还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。还有,子类和 父类高度耦合,修改父类的代码,会直接影响到子类。
3. 多态
是什么?
- 多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
- 多态这种特 性也需要编程语言提供特殊的语法机制来实现
- 继承
- *接口类
- duck-typing
有什么用?
- 可扩展性,如Iterator,要遍历新的容器只要实现并重写方法即可
- 复用性,如Iterator,只要next方法就能输出
- 是很多设计模式、设计原则、编程技巧的代码实现基础。
怎么用?
public interface Iterator {
String hasNext();
String next();
String remove();
}
public class Array implements Iterator {
private String[] data;
public String hasNext() { ... }
public String next() { ... }
public String remove() { ... }
//... 省略其他方法...
}
// 可扩展性
public class LinkedList implements Iterator {
private LinkedListNode head;
public String hasNext() { ... }
public String next() { ... }
public String remove() { ... }
//... 省略其他方法... 、
}
public class Demo {
private static void print(Iterator iterator) {
// 复用性
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static void main(String[] args) {
Iterator arrayIterator = new Array();
print(arrayIterator);
Iterator linkedListIterator = new LinkedList();
print(linkedListIterator);
}
}
4. 抽象
是什么?
- 抽象就是暴露函数,即让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的
- 抽象是所有语言都具有的特性,但面向对象提供了更具体的抽象如抽象类和接口
有什么用?
- 提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围
- 它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息
本文标题:【面向对象】基础(一):四大特性分析
本文链接:https://blog.quwenai.cn/post/10187.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。





还没有评论,来说两句吧...