Java系列1 -- 浅谈面向对象

时间:2021-06-26 17:31:02

也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言"。那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C++他强在哪里呢?“面向对象”在我们实际编程中有什么作用呢?

在开始实际的java之旅前,我们再次老生长谈下。我就按我自己的理解结合我这两年左右的编程经验来简单的说一说。其实在java之前我是学习C和C++的,但是并没有实际拿C或者C++写过什么项目,所以,一开始我就是直接用java的,在第一年的时候,我对面向对象的理解仅限于书本上的“封装”、“继承”、“多态”,而这三个词对于那时的我来说,也就是三个名词而已,根本没有理解。

在说面向对象编程(OOP)前,首先我们需要说下没有OOP前的编程情况,那时大家都是进行面向过程编程的,面向过程又是个什么玩意?其实这个东西我也说不出其深意,因为确实没有拿C等过程语言开发过,简单的来说,面向过程的语言核心是 一个一个的方法,每个方法实现一个具体的功能,要实现一个比较复杂的功能就必须按顺序去组装这些方法,貌似这个和java编程是一样样的,那区别到底在哪里啊?  区别就在于对数据的操作,在C中,方法操作的变量要不就是方法中的局部变量,仅供自己来使用,要不就是所有方法都可以共用的全局变量,他没有仅仅可以供某几个具有相关联系的方法使用的“小局部”变量,这就是他最大的弊病,也这是面向对象语言所解决的问题。

在我的内心深处,我一直这么认为,“程序员就是用语言来模拟世界的!”

要用语言模拟世界,那首先我们就要模拟现实世界中的事物,而不同的事物当然就要有仅属于自己的属性,比如说人有耳朵,鼻子,眼睛,嘴巴,他可以听,呼吸,看,吃,那汽车就没有这些东西。我们可以把听,呼吸,看,吃这些动词理解为C中的方法,而耳朵,鼻子,眼睛,嘴巴理解为这些方法操作的属性,我们要运动,这些器官是需要协调的,也就是说这些方法是可以共同操作这些属性的,那么在C语言中,这几个属性就需要保存在一些所有方法都可以访问的全局变量中,但是汽车发动,飞奔的方法却不需要这些个变量,这些变量只有人运动时才需要,也就是说这些个变量应该仅仅需要对人运动可见,对事物是不可见的,但是C这些面向过程的语言是做不到这些的。

这是强大的面向对象的java语言就诞生了。

他把某一类事物的属性和操作这些属性的动作(也就java中的方法)组合到了一个对象(注意,这里的对象是广义上的说法,不是java语言中类的实例化对象)中,让这些属性只能让这个对象中的方法来操作(访问),这个对象就是Java语言中的类。而把这些个属性和方法组合到一个类中的行为就是面向对象的三大特性中的 “封装”。

OOP的三大特性的“继承”和“多态”又是什么个意思呢?

“继承”从字面上理解,就是从祖辈身上拿到属于他们的东西,然后变成自己的。在java中,“继承”也是这么个情况。比如有一个动物类,他有 眼睛,鼻子,耳朵,嘴巴,能看,呼吸,听,吃。而人也是动物,也有那些属性和方法,那么在Java中,我们去创建人这个类的时候就没有必要再把这个属性和方法再写一遍,我们只需要继承动物这个类就可以了,然后在人这个类中创建仅属于人才有属性和方法 ,比如做作业,写代码等等这些只属于人的方法。

那么“多态”有怎么理解呢? 字面上理解:用相同的方法处理来自不同类的对象。当然这些方法必须是从同一个父类派生出来的,也就是说这些个不同对象的类必须继承同一个基类。比如 动物 (Animal)就是是一个基类(父类),他有吃(eat(){吃东西})这个方法,人类(Person),牛(Cattle)类都是继承自动物这个类,那么他们俩也都有了吃这个动作,同时他们有都重写了eat()这个方法,Person 的eat(){吃米饭},Cattle 的eat(){吃草}

这时,我用动物类申明了两个对象 Animal a1,a2 ; 然后分别用Person 和 Cattle去实例化他,然后分别调用eat()方法,伪代码如下:

a1 = new Person();

a1.eat();

a2 = new Cattle();

a2.eat();

a1 和 a2都是 Animal的对象,他们调用eat()的时候到底是掉Animal自身的eat()还是该调用Person的或者是Cattle的?当然正确的做法是a1调用Person的eat()方法去吃米饭,a2去调用Cattle的eat()方法去吃草。而Java恰恰就是这么做滴。Java的这种行为 就叫做“多态”。

也许大家这时候就又会问,他是怎么做到的?这个具体的工作原理,我们放在之后文章中详细解释,这个涉及的java的动态绑定。由于我是在下班后写这个文章,现在的时间是00:28,明天还要工作,所以就这篇文章就写到这里了。下篇文章继续。。。

以下是我的微信公众号,技术大牛集结号,欢迎您的关注!

Java系列1 -- 浅谈面向对象