JavaSE基础学习-OOP(面向对象程序设计)

初识Java

Java是一门高级的面向对象的编程语言。
Java的设计者已经编写了Java的白皮书用来解释设计初衷,并且发布了一个简短摘要,主要包括以下11个方面。

  • 简单性
  • 面向对象
  • 分布式
  • 健壮性
  • 安全性
  • 体系结构中立
  • 可移植性
  • 解释性
  • 高性能
  • 多线程
  • 动态性

以上11个方面这里就不一一解释了,有兴趣的可以去参考《JAVA核心技术》一书,这本书对学习JAVA还是很有帮助的。

(小脑洞:为什么Java这么流行?)

  • Java通过JVM实现的"一处编写,到处执行"的特性。
  • JVM提供垃圾回收器,大多数情况下程序员不需要考虑内存的分配和回收。
  • Java庞大的生态,有许多已经成熟的开源软件。
  • Java客户端开发领域的应用场景 - Android开发。
  • Java一直在发展和进化。

什么是面向对象?什么是对象?

因为这篇文章是我Java学习的第一篇文章,所以就在文章开头介绍了一下Java语言,现在让我们回到这篇文章的主要内容,什么是面向对象。
从我们接触到Java语言开始,就有人告诉我们,这是一门面向对象的编程语言,想要了解什么是面向对象,要先了解一下两个基本概念,类和对象。

什么是对象?什么是类?

先来一段百度百科,对象,常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方等含义。
后半段我们不考虑,我们只看前半段,对象指行动或思考时作为目标的事物。
这是什么意思,我们来举个例子,我们找一个木匠做把椅子,在这个例子中,木匠就可以看成一个对象;做了把椅子,这是木匠的行动,这称为对象的行为。但这之中隐藏了一个东西,那就是做椅子的工具,这是木匠自带的,我们称为对象的属性。
从上面的例子可以看出,一个客观存在的事物可以称为对象,一架飞机,一台电脑,甚至一阵风等等,都可以称为对象,而且对象往往具有一些自己特定的属性和行为。
我们知道了什么是对象之后,我们再来引出类的定义,类是具有相同属性和方法的一组对象的集合,知道这个概念之后再看上面这个例子,这时,木匠严格上已经不算是一个对象了,
因为他是一个职业,我们并没有精确到特定的人,所以这个例子要改成我们找王木匠做把椅子,我们姑且认为这个王木匠是唯一的,这时,他就成为了一个对象,而木匠就是他的类。
类是具有相同属性和方法的一组对象的集合。类是不存在的,类仅仅用来描述对象的信息,比如我们把带着工具能做椅子的人称为木匠,木匠就成为了这一系列人的总称和描述。

类和对象的关系

根据上面的例子我们可以总结出类和对象的关系好像模具和铸件的关系,类实例化的结果就是对象,而对象的抽象就是类。
这个回答比较教科书,我们还是看例子,上面的王木匠,他是属于木匠类的一个具体的对象,我们称他为木匠类的一个实例,一个类转变成具体的对象(实例)的过程,我们称为实例化。
那什么是类的抽象呢,我们上面对木匠这个类的定义是,带着工具能做椅子的人就是木匠,其中,所有的木匠(对象)都有工具(属性),他们都会做椅子(行为),这种把一系列对象相同的属性和行为抽取出来的过程,我们称为对象的抽象。
看到这里有人说了,例子里不止一个类,木匠,工具,椅子,甚至椅子的形状都可以看成一个类,这也是Java里常说的一句话了,叫"万物皆对象",任何存在的事物,我们都可以把他看成对象,从而向上抽象出它的类。

什么是面向对象?

我们已经了解了什么是对象,什么是类,现在我们开始聊面向对象。
首先,面向对象(Object Oriented),与之对应的是之前的面向过程。
继续举例子,我想要一把椅子,这是我的目的,也就是我的需求。面向过程,顾名思义,我要考虑完成需求的所有过程,从选木材,找工具,锯木头等等一系列操作都要自己考虑,自己去做。
而面向对象呢,我有了需求之后,先去找有没有可以完成需求的对象,我找到了木匠,我告诉木匠我想要一把椅子,之后我就等着椅子做好就行了,我不用去考虑椅子是怎么做出来的等一系列面向过程需要考虑的事情。
当然了,如果我们没有找到可以完成自己需求的对象,那我们就要重新面向过程了,这就是传说中的自己造轮子。当然了,大家也不要重复造轮子,如果有现成的工具的话,
自然是要拿来用的,别人的轮子我们可以拿来学习他的编程思想,或者这个轮子我们有别的需求需要改一下,我们可以对它进行二次加工,但是如果造一个功能完全一样的轮子,那是完全没有必要的。(这就是开源的好处,如果轮子全都闭源的话,我们不仅没的学,还没的改,人人都要自己造)
面向对象就是可以使程序员可以将重点放在需求上,而不是实现需求的过程,逻辑上的操作止步于对象,而不是对象背后的实现过程。

面向对象和面向过程的区别(或者面向对象的好处)?

  • 当需求发生改变时,面向对象可以直接操作对象做对应的修改即可,面向过程则需要重新规划。
  • 面向过程是流程化的,需要一步一步分析实现;面向对象是模型化的,把对象模型成盒子,盒子具有什么功能,需要什么直接调用即可。
  • 其实面向对象底层仍然使用的面向过程,通过面向过程抽象成类,然后封装起来,就变成了面向对象。

面向对象的三大基本特征

封装

将对象的属性和行为隐藏起来,仅提供公共的访问方式,提高可复用性和安全性。
(将对象形成黑盒,对外暴露功能,而不暴露功能实现)

继承

将多个类相同的属性和方法抽取出来形成一个父类,提高代码复用性。
(例子:喜鹊是一种鸟,鸟类和喜鹊类便是一个继承关系,鸟类是父类,喜鹊类是子类)
(前面讲到了不要重复造轮子,多个类有相同内容时会出现大量重复代码,为了避免所以出现继承。提示:继承破坏了封装)

多态

父类或接口的引用变量可以指向子类或实现类的实例对象。
(例子:树上有一只喜鹊,我可以说成树上有只鸟,但不能反过来说)
(顾名思议,一个对象的多种状态。)

面向对象的五大原则

  • 单一职责原则SRP(Single Responsibility Principle)
    类的功能要单一。不能厨师的工作写到木匠类里。
  • 开放封闭原则OCP(Open-Close Principle)
    一个模块对于拓展是开放的,对于修改是封闭的。
  • 里式替换原则LSP(the Liskov Substitution Principle LSP)
    子类可以替换父类出现在父类能够出现的任何地方。比如你代替你父亲在家里做家务。
  • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
    高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。比如你出国,你应该说你是中国人,而不是XX市,XX县人,国与国之间应该依赖于国模块,而不是子模块市县。
  • 接口分离原则ISP(the Interface Segregation Principle ISP)
    设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个对象有多个功能,多个功能分开多个接口比一个接口好。

还是第一次写这么长的博客,文笔上还略显生涩,写出来的也都是我目前的理解,我会根据大家的评论或者自己以后的深入进行修改,希望大家有自己的理解或者文章哪里有瑕疵可以评论告诉我,我会第一时间修改的,谢谢,希望和大家一起成长。

重峦叠嶂,庆幸相逢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章