Java系列1 -- 浅谈面向对象
也许每一个计算机专业的人,在大学学习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 -- 浅谈面向对象的更多相关文章
- JAVA系列:浅谈Java中的equals和==
在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- Spring5.0源码学习系列之浅谈BeanFactory创建
Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...
- 【公众号系列】浅谈SAP项目管理的技能
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[[公众号系列]浅谈SAP项目管理的技能 写 ...
- 【ASP.NET MVC系列】浅谈数据注解和验证
[ASP.NET MVC系列]浅谈数据注解和验证 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...
- 【Fiori系列】浅谈SAP Fiori的设计美感与发展历程
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- java反射机制浅谈
一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- 【ASP.NET MVC系列】浅谈NuGet在VS中的运用
一 概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...
随机推荐
- 史上最简单的C语言链表实现,没有之一
#include <stdio.h> #include <string.h> #include <stdlib.h> #define NR(x) (sizeof(x ...
- lpad函数
函数介绍 lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 2 ...
- 近期Mac上编译geany软件的总结
以前在Mac上装过port,后来改为brew.但是原来port装在/opt/local下的很多程序没删掉,path路径也没改,导致很多程序被重复安装,配置混乱.最后我痛下狠心用port uninsta ...
- rubygem若干常用选项参数
可以用gem help commands看所有支持的参数,这个比gem -h显示的全: wisy@wisy-ThinkPad-X61:~/src/ruby_src$ gem help commands ...
- Nginx常用模块安装命令
将目录切换至Nginx安装包目录下,使用./configure命令进行安装.一些第三方模块需要先下载过来,指定下解压后的目录即可. ./configure --prefix=/usr/local/ng ...
- getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'
<body> <canvas id=" style="border:1px solid #c3c3c3;"> Your browser does ...
- 视频博文结合的教程:用nodejs实现简单的爬虫
教学视频地址: https://v.qq.com/x/page/b0643tut4ze.html 前言 本喵最近工作中需要使用node,并也想晋升为全栈工程师,所以开始了node学习之旅,在学习过 ...
- 乐学习知选择--我的J2EE技术历程
转眼换工作已经两个多月了,转眼今年已经到9月份了,转眼女朋友也来到了自己身边.有太多的转眼,如今在这个经理不在的早晨,可以肆意的点点这里看看那里,想想自己,有点吉利思的感觉. 这两个多月,知道了什么叫 ...
- javascript学习(一)构建自己的JS库
库是一个饱受争议的热门话题.一种观点认为它是一种非常棒的工具,是任何开发者都不可或缺的:另一种观点则认为在不理解库的内部工作原理的情况下对库形成依赖,会助长懒惰的风气从而导致开发者素质下降 库是一个饱 ...
- treeview调用数据库成树
目的:将数据库中的数据与树控件绑定背景:我们想在树控件中显示销售客户的层级列表,这个销售客户的分层是这样的,先按"大区",再按"省份",最后到"客户& ...