也许每一个计算机专业的人,在大学学习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. 安卓笔记-- ListView点击和长按监听

    其中点击监听为setOnItemClickListener() 具体实现代码如下 listView.setOnItemClickListener(new AdapterView.OnItemClick ...

  2. 在linux下制作静态库和动态链接库的方法

    静态库 .o文件的集合 制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ... 编译 gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径 ...

  3. 初识MySQL数据库的各种CMD命令窗口下的指令

    今天我们就来看一下数据库的各种命令,以下命令全部是从CMD命令窗口下的命令行输入指令,首先如果如果输入mysql,系统提示"mysql不是内部命令或外部命令.那么这其实是环境变量没有设置好的 ...

  4. 深度学习-conv卷积

    过滤器(卷积核) 传统的图像过滤器算子有以下几种: blur kernel:减少相邻像素的差异,使图像变平滑. sobel:显示相邻元素在特定方向上的差异. sharpen :强化相邻像素的差异,使图 ...

  5. React 深入系列5:事件处理

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列5:事件处理 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...

  6. 推荐eclipse插件Properties Editor(转)

    Properties Editor 是一款properties文件编辑器. 需求:一般我们在做“国际化”功能时,我们需要properties中文表示方式用unicode表示.eclipse默认prop ...

  7. 前端技术之_CSS详解第六天--完结

    前端技术之_CSS详解第六天--完结 一.复习第五天的知识 a标签的伪类4个: a:link 没有被点击过的链接 a:visited 访问过的链接 a:hover 悬停 a:active 按下鼠标不松 ...

  8. MySQL的日志(一)

    本文目录:1.日志刷新操作2.错误日志3.一般查询日志4.慢查询日志5.二进制日志 5.1 二进制日志文件 5.2 查看二进制日志 5.2.1 mysqlbinlog 5.2.2 show binar ...

  9. Day15 Javascipt内容补充

    JavaScript函数: 函数: function 函数名(a,b,c){ 执行代码 } 1,如何去找到标签 Dom直接选择器: 1,找到标签 #获取单个元素 document.getElement ...

  10. 利用truffle与智能合约进行交互

    先了解相关指令,再观看比较合适:http://truffle.tryblockchain.org/ 安装: 先完成上一条博客的安装,再来进行下面的操作:http://www.cnblogs.com/t ...