软件构造感悟之面向对象的编程

面向对象的编程(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

Override vs Overload

7. 泛型

泛型(generics)是一种参数化类型的机制,它使得我们可以编写出可以操作多种类型的代码,而不需要为每种类型都编写重复的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值