面向对象的编程(Object Oriented Programming,OOP) {ignore=true}
文章目录
1. OOP的基本概念
对象(Object)来源于 20 世纪 60 年代的 Simula 编程语言。为了描述这种架构,他在 1967 年创造了 面向对象编程(object-oriented programming) 这个术语。
由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(Addison-Wesley Professional, 1994)编写的书 Design Patterns: Elements of Reusable Object-Oriented Software 被俗称为 The Gang of Four (字面意思为 “四人帮”),它是面向对象编程模式的目录。它这样定义面向对象编程:
面向对象的程序是由对象组成的。一个 对象 包含数据和操作这些数据的过程。这些过程通常被称为 方法 或 操作。
另一个通常与面向对象编程相关的方面是 封装(encapsulation) 的思想:对象的实现细节不能被使用对象的代码获取到。所以唯一与对象交互的方式是通过对象提供的公有 API;使用对象的代码无法深入到对象内部并直接改变数据或者行为。封装使得改变和重构对象的内部时无需改变使用对象的代码。
继承(Inheritance) 是一个很多编程语言都提供的机制,一个对象可以定义为继承另一个对象定义中的元素,这使其可以获得父对象的数据和行为,而无需重新定义。继承的一个重要特性是 多态(polymorphism),它允许子类重写父类的方法,这样即使使用父类的代码也可以调用子类的方法。
但是继承因其时常带有共享多于所需的代码的风险。子类不应总是共享其父类的所有特征,但是继承却始终如此。如此会使程序设计更为不灵活,并引入无意义的子类方法调用,或由于方法实际并不适用于子类而造成错误的可能性。
与此同时,有些编程语言只允许单继承(意味着子类只能继承一个父类),进一步限制了程序设计的灵活性。
由面向对象编程的历史我们可以看出,对于这种编程范式没有一个统一的定义,而封装继承多态是人们为了实现OOP而总结出的一套方法,但仍有缺陷。
2. 接口
接口(interface)是一种特殊的类,它只包含方法的签名,而不包含实现。接口可以被类实现,一个类可以实现多个接口。接口的实现类必须实现接口中定义的所有方法。接口之间可以继承与扩展,这使得接口可以像类一样被组合。
实际更倾向于利用接口来定义变量。
通过使用 default
方法,接口可以提供默认的方法实现。这使得接口可以在不破坏实现类的情况下添加新的方法。
3. 封装与信息隐藏
封装是面向对象编程的一个基本特性,它使得对象的实现细节对使用对象的代码不可见。封装的一个重要特性是信息隐藏,它使得对象的实现细节对使用对象的代码不可见。
为了封装,我们使用接口类型声明变量,并且客户端仅使用接口中定义的方法,客户端代码无法直接访问属性。
对于 Java
来说,有三个修饰词,它们可以用来控制访问权限:
- private:只有类内部可以访问
- protected:只有类内部和子类可以访问
- public:所有类都可以访问
4. 继承与重写(Override)
tips: 严格继承:子类只能添加新方法,无法重写超类中的方法。
有时,因为子类的实际应用场景,我们会对父类的方法进行重写,利用重写可以使得具体场景具体应用,而对大部分通用场景的情况,我们可以直接使用父类的方法,减少了代码冗余。
重写时不要改变该方法的本意!!!
5. 重载(Overload)
重载可以使多个方法具有同样的名字,担忧不同的参数列表或返回值类型。
基于重载的这种特性,我们可以方便client调用,而不需要记住很多方法名。
6. Override vs Overload
7. 泛型
泛型(generics)是一种参数化类型的机制,它使得我们可以编写出可以操作多种类型的代码,而不需要为每种类型都编写重复的代码。