`
spirithenry
  • 浏览: 1748 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

TIJ Learning: 面向对象的3大特性 7大原则

阅读更多

面向对象的3大特性:

 

封装

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

在Java中类中成员的属性有:public, protected, <default>, private,这四个属性的访问权限依次降低。

 

继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。

 

要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

 

在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

 

继承概念的实现方式有三类:实现继承、接口继承和可视继承。

Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;

Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

Ø         可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

 

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

 

抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。

 

OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

 

多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

 

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

 

其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”

 

那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

 

 

 

面向对象的7大基本原则
单一职责原则SRP(Single Responsibility Principle)、开放封闭原则OCP(Open-Close Principle) 、替换原则、依赖原则(the Dependency Inversion Principle DIP) (the Liskov Substitution Principle LSP) 、接口分离原则(the Interface Segregation Principle ISP)、“迪米特”法则 、组合/聚合原则

1、单一职责原则SRP(Single Responsibility Principle)
即一个类只负责一项职责
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。

2、开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

3、里氏替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。

4、依赖倒转原则(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造 成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

5、接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。即面向接口编程

6、“迪米特”法则
又叫最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解
① 在类的划分上,应该创建有弱耦合的类;
② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
③ 在类的设计上,只要有可能,一个类应当设计成不变类;
④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
⑤ 尽量降低类的访问权限;
⑥ 谨慎使用序列化功能;
⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。

7、.组合/聚合原则
又叫合成复用原则。原则就是在一个新的对象里面通过关联关系(包括组合关系和聚合关系)使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用其已有功能的目的。也就是,要尽量使用类的合成复用,尽量不要使用继承。
就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。这个原则有一个简短的描述:要尽量使用合成、聚合,尽量不要使用继承。

1)  新对象存取成分对象的唯一方法是通过成分对象的接口

2)  这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不到的

3)  这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象

4)  合成、聚合可以应用到任何环境中去,而继承只能应用到一些有限环境中去

5)  导致错误的使用合成、聚合与继承的一个常见原因是错误的把“Has-a”关系当作“Is-a”关系。如果两个类是“Has-a”关系那么应使用合成、聚合,如果是“Is-a”关系那么可使用继承

在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。

1)   继承复用:实现简单,易于扩展。破坏系统的封装性,从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )

2)   组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用)

组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;

其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。

 

分享到:
评论

相关推荐

    TIJ4-solutions

    《Thinking in Java》第四版全面覆盖了Java语言的核心特性,包括基础语法、面向对象编程、集合框架、多线程、网络编程、GUI编程等。这本书以深入浅出的方式引导读者理解Java语言的设计理念,并提供了大量实例来实践...

    tij4:java中的思考第四版

    3. **封装**:封装是隐藏对象内部实现细节的过程,通过访问修饰符(如public、private、protected)实现。这有助于保护数据免受外部非法访问,并提供公共接口供其他代码使用。 4. **继承**:继承允许一个类(子类)...

    thinkinjava源码-TIJ4:java中思考的源代码

    2. **面向对象编程**:Java是一种面向对象的语言,源码展示了如何设计和实现类、接口、抽象类,以及如何利用封装、继承和多态性来构建复杂的软件系统。此外,还涵盖了构造函数、析构函数、访问修饰符(public、...

    Proyecto_Graficos_2021_tij2048:图形项目,使用Panda 3D播放python制作的社交主题的老游戏

    在这个名为"Proyecto_Graficos_2021_tij2048"的项目中,开发者运用了Python编程语言以及Panda 3D游戏引擎,创造了一个具有社交元素的经典游戏。这个项目不仅展示了Python在游戏开发领域的应用,还体现了Panda 3D引擎...

    TIJ4-code-master.zip及相关jar包、练习题答案

    - **面向对象**:Java是面向对象的语言,书中详细介绍了封装、继承、多态三大特性,以及接口、抽象类的应用。 - **异常处理**:异常处理在Java中占有重要地位,书中详细讲述了try-catch-finally机制和自定义异常。...

    TIJ阅读笔记.doc

    【TIJ阅读笔记】 在Java编程中,内存管理是一个关键的概念。Java的内存分为两种主要区域:堆(Heap)和栈(Stack)。堆是用于动态创建对象的主要内存池,包括数组和其他复杂对象,由垃圾回收机制自动管理。而栈则...

    TIJ4-code.rar_TI

    2. **面向对象编程**:书中深入讲解了封装、继承、多态等面向对象特性,并提供了大量实例。例如,你可以看到如何设计类、接口,以及如何实现多态性,这对于理解Java的OOP理念至关重要。 3. **异常处理**:Java的...

    TIJ4-code_ThinkinginJava_conversationemk_

    代码中可能会展示如何定义类,创建对象,以及理解封装、继承和多态等面向对象特性。 3. **异常处理**:Java的异常处理机制是其强大之处,通过try-catch-finally语句块,可以优雅地处理运行时错误。 4. **集合框架*...

    thinkinjava源码-TIJ4Example:Java4示例源代码中的思考

    2. **类与对象**:Java是一种面向对象的语言,"TIJ4Example"会展示如何定义类、创建对象、封装、继承和多态等面向对象编程的概念。这有助于理解对象的生命周期和它们之间的关系。 3. **异常处理**:Java异常处理...

    Thinking In Java 第四版-源代码TIJ4-code

    2. **面向对象编程**:这是Java的核心特性。通过代码,你可以看到如何创建类、对象,理解封装、继承和多态的概念。比如,抽象类、接口的实现,以及构造函数和析构函数的应用。 3. **异常处理**:书中示例展示了Java...

    Thinking in java\TIJ4-solutions-demo

    - 面向对象编程的基本原则。 - 类与对象的关系。 - 构造函数的作用与定义。 - 成员变量与方法。 - 封装、继承、多态的基本概念及其应用。 5. **第5章:数组** - 数组的声明与初始化。 - 多维数组的使用。 -...

    tij4-code:java编程思想第四版-GIT

    对于Java初学者而言,阅读并实践《Java编程思想》的源代码可以帮助你更好地掌握面向对象编程的概念,如类、对象、继承、多态等。此外,还能接触到实际项目中的编码规范和设计模式,提升编程能力。通过Git,你可以...

    TIJ_Exercises:Java 4 中思考的练习

    接着,书中深入介绍了面向对象编程(OOP)的核心概念,如封装、继承和多态。在练习中,你可以通过创建和使用类来实现这些概念,例如定义接口、实现抽象类、使用访问修饰符以及理解多态性如何提高代码的灵活性和可...

    javajar源码-TIJ4-code:java编程思想第四版源码maven构建注意:在D:\Java\jdk1.7.0_80\jre\lib

    Java是一种面向对象的、跨平台的编程语言,以其“一次编写,到处运行”的特性闻名。它具有丰富的类库,适用于各种应用场景,包括Web开发、移动应用、企业级应用等。Java的设计目标是简单性、可移植性、安全性以及...

    TIJ4-code:Java源代码中的Tink

    完成后,您应该看到几个级别的目录,并且在C:\TIJ4\code目录中,除其他外,您C:\TIJ4\code看到与本书各章相对应的子目录。 从的安装Java JDK SE5或更高版本。 您最终还将需要该文档,该文档可在该页面的后面找到。...

    TIJ4-Maven:用于在 Java 中思考的 maven repo

    《Thinking in Java》是由 Bruce Eckel 编著的一本经典 Java 入门书籍,第四版(TIJ4)涵盖了 Java 的各个方面,包括基础语法、面向对象编程、集合框架、多线程、网络编程等。本书以其深入浅出的讲解方式深受程序员...

    Thinking in Java(第一版)

    3. **类与对象**:Java是面向对象的语言,书中会介绍如何定义类,创建对象,以及封装、继承和多态等面向对象的三大特性。 4. **接口**:Java中的接口是实现抽象化的一种方式,用于定义行为规范,让类之间可以实现多...

    TIJ4 Code

    Thinking in java 4 Source Code

    thinkinginjava源码-TIJ4-CP2:添加ThinkinginJava第二章原书自带的源代码

    5. **多态性**:多态性是面向对象的另一个重要特性,它允许使用父类引用指向子类对象。在`TIJ4-CP2`的代码中,可能会看到抽象方法和接口的使用,这些是实现多态的关键。 6. **抽象类与接口**:如果一个类不打算实例...

Global site tag (gtag.js) - Google Analytics