一. 封装
1. 为什么要封装?
为了信息隐藏和数据保护。外部(调用方)只能通过类对外授权的函数访问内部数据.
2. 语言层面。如何实现封装的数据保护信息隐藏?
通过访问权限控制的关键字,Java中就是public private。 protected
3. 为什么要对类的属性, 做数据保护?
所谓数据保护就是属性的保护,不让外部直接修改类的属性,而是只能通过类自身暴露的方法修改,让对象只能自己修改自己的数据。因为类中的属性很可能有关联性,互斥性。修改一个,另一个也要改变。如果不暴露统一的修改方法,很可能造成修改的错误使用。
二. 继承
1. 继承表示了一种什么样的逻辑关系?
继承是用来表示类之间的 is-a 关系,比如猫是一种哺乳动物.
A继承b,表达的意思就是,A “is a” B。
2. 为什么说"多用继承少用组合"?
继承和组合都能实现代码复用的目的。很多人甚至觉得应该多用组合,甚至不用继承. 继承的概念很好理解,也很容易使用。不过,过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差。为了了解一个类的功能,我们不仅需要查看这个类的代码,还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。还有,子类和父类高度耦合,修改父类的代码,会直接影响到子类
三. 多态
1. 什么是多态?
多态是指,子类可以替换父类. 代码在编写时, 组合的事父类定义的属性; 而在实际的代码运行时,调用子类的方法实现。
2. 实现多态,需要语言层面哪三个机制?
- 父类可以引用子类对象。
- 子类要能继承父类,表示子类也是父类的一员, 也能当父类对象使用。
- 子类也能复写父类的方法。
四. 面向对象退化成面向过程的一些做法
1. 为什么不应该对所有属性暴露 setter 方法?
对每个属性添加setter方法,破坏了封装的"隐藏内部数据,外部仅能通过类提供的有限的接口访问"特性. 相当于没有提供数据的访问权限控制,任何代码都可以随意修改它,代码就退化成了面向过程编程风格的了。
2. 对集合类型的属性加getter方法也会破坏类的封装特性?
是的,如果直接用getter把集合属性暴露给外层,外层还是能对集合增删元素,或者修改其中某个元素的属性,又破坏了封装特性
3. 为什么常见的web开发其实是面向过程开发?
因为常见的web开发是mvc分层开发,分为数据层服务层接口层。每层有自己的vo或bo对象。所以每一层都是数据和方法分开的贫血模型,没有封装的特性。也就不是面向对象。