也许每一个计算机专业的人,在大学学习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. The 7th tip of DB Query Analyzer

              The 7th tip of DB Query Analyzer MA Gen feng ( Guangdong Unitoll Services incorporated, Gu ...

  2. 浮点数据有损压缩算法 附完整C代码

    在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...

  3. 从小故事来谈nginx负载均衡

    负载均衡 负载均衡是任何一个有一定规模的互联网企业都会考虑的问题,负载方式很多,有依靠硬件实现的,也有依靠软件实现负载的. 今天来聊聊使用软件来负载的方式 你可能听过各自负载的方式,比如常见的ngin ...

  4. XML 和 java对象相互转换

    XML 和 java对象相互转换 博客分类: XML 和 JSON   下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...

  5. 推荐两个国外公共CDN服务

    最近这个国家信息安全问题舆论形势又见紧张,Google的访问又被强力堵截,谷歌的公共CDN也顺带被波及,像AngularJS这样的前卫js库,国内几大公共CDN服务都不提供支持.国外目前两大第三方公共 ...

  6. 第一次作业 orm环境构建(hibernate)及基本的demo

    一.数据库 1.创建数据库hibernate01-1514010311 2.创建表 customer CREATE TABLE customer( id int(11) not null auto_i ...

  7. java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)

    在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~ 1.手动装配 <bean id="todo" cla ...

  8. Ubuntu16.04下安装Hive

    上一篇博客我们已经说过了要如何安装Hadoop,别忘记了我们的目的是安装Hive.所以这篇博客,我就来介绍一下如何安装Hive. 一.环境准备 (1)Vmware (2)  Ubuntu 16.04 ...

  9. Python杂记

    一.函数 1.numpy 模块中的nonzero函数 nonzero返回的数非零元素的下标. 如果输入是单维度的时候它的返回值只有一个:如果输入是多个维度的话,那么它的返回值也是多个维度的.并且的它的 ...

  10. js实现定时器,时间倒计时为0后停止

    <script type="text/javascript"> var orign_time = 1496706400; var leftTime = Date.par ...