也许每一个计算机专业的人,在大学学习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 -- 浅谈面向对象的更多相关文章

  1. JAVA系列:浅谈Java中的equals和==

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  2. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  3. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  4. 【公众号系列】浅谈SAP项目管理的技能

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[[公众号系列]浅谈SAP项目管理的技能   写 ...

  5. 【ASP.NET MVC系列】浅谈数据注解和验证

    [ASP.NET MVC系列]浅谈数据注解和验证   [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...

  6. 【Fiori系列】浅谈SAP Fiori的设计美感与发展历程

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美 ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  9. 【ASP.NET MVC系列】浅谈NuGet在VS中的运用

    一     概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...

随机推荐

  1. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  2. WinCE中断结构分析

    前一段时间研究了一下WinCE下的中断结构,整理了一下,希望与大家讨论. 最下面有PDF版本下载,便于保存 版权申明:本文版权归ARMCE所有,转载请保留所有原文内容及 ARMCE标识并注明出 自 A ...

  3. os x下如何挂载iso镜像

    在linux下可以使用 mount -o loop 在os x下mount好想没有loop选项,不过可以用系统自带的命令 hdiutil mount xxx.iso 即可,弹出可以用 hdiutil ...

  4. getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'

    <body> <canvas id=" style="border:1px solid #c3c3c3;"> Your browser does ...

  5. AngularJS学习笔记之directive——scope选项与绑定策略

    开门见山地说,scope:{}使指令与外界隔离开来,使其模板(template)处于non-inheriting(无继承)的状态,当然除非你在其中使用了transclude嵌入,这点之后的笔记会再详细 ...

  6. 关于web页面JApplet打印小票

    版权所有 做这个的例子太少,我把我做的示例亮出来 一.先说说需要的版本 1.我用的浏览器只有ie: 火狐只支持52版本以下,并且是java7.java8.chrome不支持 2.applet客户端打印 ...

  7. 更改一个链接的文本、URL 以及 target

    <html> <head> <script type="text/javascript"> function changeLink() { do ...

  8. Ng1从1.3开始的变更史

    从今有个ng1 spa项目,项目可能会有ng1的版本升级问题,特简要摘录从1.3的主要版本变更,所以内容来自migration guide. 1.3的主要变更: 1.controller不能再以全局简 ...

  9. esp-12e折腾

    寒假前就从x宝买了esp-12e以及esp32s,当时似乎是想给自己的蓝牙开门升级换代?esp32s拿来过度linux? 寒假放在书包拿回去以为有时间会玩玩,没想到一直耽搁到现在.前两天才拿出来,网上 ...

  10. R贡献文件中文

    贡献文件 注意: 贡献文件的CRAN区域被冻结,不再被主动维护. 英文 --- 其他语言 手册,教程等由R用户提供.R核心团队对内容不承担任何责任,但我们非常感谢您的努力,并鼓励大家为此列表做出贡献! ...