⾯向对象的三⼤特征和六⼤基本原则
⼀、⾯向对象的三⼤特征
封装:隐藏对象的属性和实现细节,仅对外公开接⼝,控制在程序中属性的读取和修改的访问级别。
封装的⽬的有两个,⼀是增强安全性和简化编程。使⽤者不必了解具体的实现细节,⽽只是要通过外部接⼝,以特定的访问权限来使⽤类的成员。⼆是降低不同类之间的影响。封装使⼀部分成员充当类与外部的接⼝,⽽将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进⽽增强数据的安全性和简化程序的编写⼯作。
继承:继承就是⼦类继承⽗类的特征和⾏为,使得⼦类对象(实例)具有⽗类的实例域和⽅法,或⼦类从⽗类继承⽅法,使得⼦类具有⽗类相同的⾏为。⼦类可以扩展⾃⼰的⽅法。抽象程度:⽗类>⼦类
多态:即多种状态。接⼝的多种不同的实现⽅式即为多态。多态是⽅法重载、继承、⽅法重写、⾃动转型等技术的特性。
多态的实现⽅式:1.重写和重载;2.接⼝;3.抽象类和抽象⽅法。
⼆、⾯向对象的六⼤原则
单⼀职责原则(SRP:Single responsibility principle)
⼜称单⼀功能原则,⾯向对象五个基本原则(SOLID)之⼀。它规定⼀个类应该只有⼀个发⽣变化的原因。如果⼀个类承担的职责过多,就等于把这些职责耦合在⼀起了。⼀个职责的变化可能会削弱或者抑制这个类完成其他职责的能⼒。解决⽅案就是要解耦和增强内聚性。
开闭原则(OCP:Open Closed Principle)
对于扩展是开放的,对于修改是关闭的,这意味着模块的⾏为是可以扩展的。当应⽤的需求改变时,我们可以对模块进⾏扩展,使其具有满⾜那些改变的新⾏为。实现开闭原则的关键就在于“抽象”。把系统的所有可能的⾏为抽象成⼀个抽象底层,这个抽象底层规定出所有的具体实现必须提供的⽅法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从⽽使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出⼀个或多个新的具体实现,可以改变系统的⾏为,因此系统设计对扩展是开放的
⾥⽒替换原则(LSP:Liskov Substitution Principle)
任何基类可以出现的地⽅,⼦类⼀定可以出现。 LSP是继承复⽤的基⽯,只有当衍⽣类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复⽤,⽽衍⽣类也能够在基类的基础上增加新的⾏为。通俗地讲就是,⼦类可以去扩展⽗类的功能,但是不能改变⽗类原有的功能。
它包含以下⼏层意思:
⼦类可以实现⽗类的抽象⽅法,但是不能覆盖分类的⾮抽象⽅法。
⼦类可以增加⾃⼰独有的⽅法。
当⼦类的⽅法重载⽗类⽅法的时候,⽅法的形参要⽐⽗类⽅法的输⼊参数更加宽松。
当⼦类的⽅法实现⽗类的抽象⽅法时,⽅法的返回值要⽐⽗类更严格。
依赖倒置原则(DIP:Dependence Inversion Principle)
A.⾼层次的模块不应该以来与低层次的模块,他们都应该以来与抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
⾯向过程的开发,上层调⽤下层,上层依赖于下层,依次当下层发⽣剧烈变动时,上层也要跟着变动,这就会导致模块的复⽤性降低⽽且⼤⼤提⾼了开发的成本。
⾯向对象的开发很好地解决了这个问题,⼀般情况下抽象的变化概率很⼩,让⽤户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这⼤⼤
降低了客户程序与实现细节的耦合度。
接⼝隔离原则(ISP:Interface Segregation Principle)
客户端不应该依赖它不需要的接⼝;⼀个类对另⼀个类的依赖应该建⽴在最⼩的接⼝上。⽐如说某个接⼝中有1,2,3,4四个⽅法。类A只需要到1,3两个⽅法,类B只需要⽤到2,4两个⽅法。但是由于我们让这两个类都去实现了这个接⼝,因此它们就必须去实现所有的⽅法,即使它们不要⽤到这个⽅法。这显然是不合理的。因此我们应该把这个接⼝进⼀步细化,分成⼀个带有1,2两种⽅法的接⼝,和⼀个带有3,4两种⽅法的接⼝。这就是接⼝隔离原则。
迪⽶特法则(Law of Demeter)
java面向对象的特征有哪些方面⼜叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说⼀个对象应当对其他对象有尽可能少的了解,不和陌⽣⼈说话。迪⽶特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独⽴,相互之间不存在(或很少有)依赖关系。
因此,应⽤迪⽶特法则有可能造成的⼀个后果就是:系统中存在⼤量的中介类,这些类之所以存在完全是为了传递类之间的相互调⽤关系——这在⼀定程度上增加了系统的复杂度。
三、总结
1.⾯向接⼝编程
2.类和接⼝的功能尽量单⼀
3.当需求改变时,我们应该通过扩展来实现新的需求,⽽不应去修改底层代码
4.降低类和类之间的耦合度(也就是关联性)。尽量把类的属性封装起来,只提供⽅法给外部。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论