再理解面向对象

    写在前边:距离最开始的理面向对象,时隔两年。中间不断地对面向对象的理解加深,这次读到一本好书《码出高效:java开发手册》。再记一点笔记。

OOP(面向对象编程)

  面向对象编程推动了高级语言的快速发展和工业化进程,OOP 的 封装,继承,多态,抽象理念是软件规模化成为可能,降低了开发成本,维护成本,复用成本。使得大型的开发变得像搭积木一样可控,方便。面向对象编程主要区别于面向过程编程。

  面向对象编程主要实现三个目标:可维护,可重用,可扩展。

oop中四大特性解释(本来有三个)

   在《码出高效:java开发手册》这本书中有强调抽象的意义,并将抽象加入到三大特性中来,变成了四大特性,正确而严谨的业务抽象能力,和分析建模能力为后续的封装继承多态建立基础。

  封装是为了解耦,达到高内聚,减少大量功能模块通过代码直接联系,取而代之的是暴露接口,掩盖实现过程。封装是在抽象的基础上决定信息是否公开,以及公开等级。封装的任务是对属性,数据,部分内部敏感行为实现隐藏。封装使得面向对象的世界变得清净,大家各扫门前雪。大家可能会对封装还有疑问,封装完了以后,还是暴露出set()get(),显然是能够得到和修改信息的。这和不封装直接修改又有什么区别呢,这不是在做无用功呢。请继续往下看:比方说,这个属性大家都能改,突然有人将访问权限将public直接改成了private,如果恰好有很多模块依赖了它,那就凉了啊,其他模块因为变成private的原因访问不到。此外,想对修改做一个日志记录,权限校验,直接修改是做不到的。

  继承是让子类可以继承父类的部分属性和行为,父类具体哪些可以暴露给子类,取决于父类。是一些重复的代码通过抽取Base类的方式,解决大量代码重复的问题。有封装的存在,让我们更好的建立具有层次感的类,使得一些基础代码,可以被间接或者直接的使用。大家都说继承是 is-a 的关系,那么如何判断是否满足 is - a 的关系呢,判断标准就是看是否符合里氏替换原则,出现父类的地方,如果使用子类替换也是可以的,那就说明具备 is-a。虽然说继承的成本很低,一个extends关键字就可以了,但是它会像抗生素一样别滥用,我们应该谨慎使用继承,认清滥用继承的危害性,方法污染和方法爆炸。方法污染是指父类具备的行为,继承给子类,但是子类不一定能有。比方说鸟会飞,继承给鸵鸟子类,鸵鸟并不能飞,这就是方法污染。子类继承父类,意味着子类对象可以调用父类的一切行为。方法爆炸是指继承树在不断地扩大,底层类拥有的方法虽然都能执行,但是由于方法众多,其中部分方法并非与当前类的功能定位有关,很容易在编程过程中选择困难。由于继承的增加,众多方法选择困难,就是方法爆炸。所以提倡组合优先原则来扩展类的能力,优先采用组合或聚集的类关系来复用其他类的能力,而不是继承。

  多态使得在复用的基础上进行扩展变得更加容易。多态是面向对象特性为基础,根据运行时的实际对象类型,同一个方法产生不同的结果,同一个行为具有不同的行为。多态提升了对象的扩展能力,和运行时的丰富想象力。我们来区分一下 "override" 和 “overload”,“override”翻译为覆写,是子类实现接口,或者继承父类时,保持方法和签名一致,实现方法体,是垂直方向上行为的不同实现。“overload”翻译为重重载,方法名相同,但是签名不相同,或者说个数不相同。多态是指在编译层面无法确认调用的方法体,以覆写为基础来实现面向对象特性,在运行期有JVM进行动态绑定,调用适合的覆写方法体来执行。而重载在编译环节是能够明确方法调用的。在《码出高效》中指出,多态是覆写,就是方法名和签名完全相同。

抽象:

  抽象又分为归纳和演绎。归纳是从具体到本质,从个性到共性 ,将对象的特性归一化。演绎从本质到具体,从共性到个性。归纳的过程中,需要抽象出对象的属性和行为的共性。演绎是在已解决问题的前提下,寻找合适的场景。演绎错误在使用集合时比较常见,比如针对查多改少的场景,使用链表就是演绎错误的体现,使用数组,或者动态数组更好一点。

Object类:

 是对所有类的抽象,我把他成为祖先类,这就需要我们清楚祖先类的方法。(下边注意介绍)

扫描二维码关注公众号,回复: 6037903 查看本文章

  getClass() 告诉我们 “我是谁” ,

  Object()构造方法告诉我们 “我从哪里来”,

  finalize()告诉我们 “到哪里去”独享销毁的时候,怎么做。

  clone() 是浅层复制对象,Object的clone()默认是浅层拷贝。浅层拷贝区别与深度拷贝。我举个例子来说明两者的关系,一个房间就在那放着,小A有一把钥匙,能够打开房间的们,所以钥匙是A对房间的引用。那么浅层复制就是配配一把钥匙,给了B,小B能够打开房间们,能够进行操作,小A在房间里边藏了一盒零食,小B到了房间,发现了零食,顺便吃了它。小A再进来,零食没了。所以说就是共享一个空间,叫浅层复制。那么深层复制是再建一个房间,并且是一模一样的,姐姐的房间里边有什么,妹妹的房间里边一样不能少。安排两个女儿进去以后,就各自打理了,愿意怎么搞就怎么搞。两个房间以后一样不一样就没关系了。所以一定要慎重使用clone()。

  hashCode()+ equals() :判断与其他元素是否是同一个。

  wait()和 notify(),是留给多线程使用的。是对象通信协作的一组方式。随着技术的不断发展,finalize()在jdk9以后已经被标记为过时方法。而wait() 和 notify() 被同步信号量和锁,阻塞集合代替。

猜你喜欢

转载自blog.csdn.net/star1210644725/article/details/89598528