什么是类?什么是对象?什么是面向对象编程?什么是面向接口编程?学习面向对象思想的语言,比如java,第一关可能就是要理解这些概念。可能有的同学学习了很久JAVA,遇到这个问题还感到有点秃然~下面就来好好琢磨一下。
“一(卤)拳(蛋)超人”
类和对象的概念
首先总结一下:类是一个模板,对象就是用这个模板创造出来的东西。
比如,男孩,他就是一个模板,男的就行,那么对象是什么呢?就是具体某个男孩,比如男孩BOB
,男孩fossi
.
请看下面一张图:
男孩女孩是比较抽象的概念,是模板,左边一排就是其具体的一些对象。你看长的都不一样,有的黑,有的白,有的高,有的矮,国家地区也不一样。但是他们都属于男孩或者女孩。
那么同理,人就是一个类,男孩女孩就是人的子类,因为男孩女孩肯定属于人这个范畴。
这里引出了JAVA特性中的继承。继承简单理解就是父类有的东西(访问级别不能是private)的,那都是你的。比如你老爸的房子,就是属于你的,你出入自由。
刚才说到继承,男孩女孩就是人的子类,男孩女孩继承了人的基本特性。此外,人还可以分为胖人和瘦人这个子类等等。
所以只要是抽象的模板,就是一个类。
对象:对象是类的一个实例,有状态和行为。例如,一条叫做fossi的活生生的男孩是一个对象,它的状态有:名字、身高、体重;行为有:唱歌、吃饭等。
类:类是一个模板,它描述一类对象的行为和状态。
下面拿狗这个类来说事。狗是动物这个类的子类。
Java中创建类
构造器方法说明
需要创造一个类对象出来的时候,要用到这个类的构造器方法,那么啥是构造器方法呢?构造器方法就是创造类时的初始化方法,和类同名的方法,你可以在里面写自己的代码
//模版=====华丽的分割线=====
一个相对比较完整的类
//模版}
=====华丽的分割线=====
创建对象
语法:
类名 对象名 = new 类名() ;
举例:
Dog fossi ; // 先声明一个 Dog 类的对象 fossi
fossi = new Dog("fossi") ; // 用 new 关键字实例化 Dog 的对象 fossi,此时调用构造方法二
通过Dog
这个类可以创造出fossi
对象.下面我才能操作这个对象:
//让它的颜色为黑色
fossi.color = "black";
//让它叫
fossi.say();
面向对象
在理解了什么是类,什么是对象,就可以来说说面向对象到底是什么了。
先来说说面向过程,大家都学习过C语言。C语言就是典型的面向过程的语言。
举个例子:要把大象装进冰箱里,这件事,面向过程的程序员是这样思考的:
把冰箱门儿打开。
把大象装进去。
把冰箱门儿关上。
上面的每一件事都用一个函数来实现。抽象为下面三个函数:
openTheDoor();
pushElephant();
closeTheDoor();
这样不挺好的吗?为什么不用面向过程的这种思维来编程呢,还要搞出什么面向对象来。
需求又来啦:
「我要把大象装微波炉里」
「我要把狮子也装冰箱里」
「我要把大象装冰箱,但是门别关,敞着就行」
这个时候,面向过程的程序员就悲剧了,来一个需求我就写一个函数,我还能下班吗?
面向对象从另一个角度来解决这个问题。它抛弃了函数,把「对象」作为程序的基本单元。
面向对象的世界里,到处都是对象。即:万物皆对象(多么富有哲学意味)。
比如人这个对象,每个人都有这样的属性:身高、体重、年龄。每个人都有这样的行为:吃饭、睡觉、上厕所。
那么,这些通用的属性+方法可以构建一个模板:人这个类。因为每个具体的人都需要这些基本的东西。那么类就对其封装。
那么,回到刚才的需求,面向对象是如何思考这件事的呢?
向冰箱下达「开门」的命令。
向大象下达「进冰箱」的命令。
向冰箱下达「关门」的命令。
就是说,我不用亲自管开门的细节,我只要叫他开门即可。
我们创建的对象,应该是刚刚好能做完它能做的事情,不多做,不少做。多做了容易耦合,各种功能杂糅在一个对象里。比如我有一个对象叫「汽车」,可以「行驶」,可以「载人」,现在的需求是要实现「载人飞行」,就不能重用这个对象,必须新定义一个对象「飞机」来做。如果你给「汽车」插上了翅膀,赋予了它「飞行」的能力,那么新来的同学面对你的代码就会莫名其妙,无从下手。
但是不禁要问:怎么实现这种下达命令就可以自动去执行的效果呢?或者说,我怎么知道它有这个功能啊!
面向接口编程
现在我们把「数据」和「行为」都封装到了对象里,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢?这个问题的关键就是接口。
因为无论是把大象装进洗衣机还是冰箱,都要求洗衣机或者冰箱有开门和关门的功能。这个时候,我们就可以抽象出来一个接口:【自动门】。这个接口里面定义两个能力:【开门】和【关门】。
让洗衣机、冰箱、微波炉这些带门的东西全部实现【自动门】接口。
这个时候,每个具体的实现可能略有不同,比如冰箱开门是往外拽,但是洗衣机开门可能是往上翻盖子。
此时,我有一个需求,把大象放进冰箱。我一看,冰箱实现了【自动门】这个接口,里面有【开门】和【关门】两个方法,ok,我知道冰箱是可以开门和关门了,那就好办了。我直接下达命令即可。还是跟上面一样的步骤/
向冰箱下达「开门」的命令。
向大象下达「进冰箱」的命令。
向冰箱下达「关门」的命令。
此时,需要将狮子也装冰箱里。那还是一样:
向冰箱下达「开门」的命令。
向狮子下达「进冰箱」的命令。
向冰箱下达「关门」的命令。
此时,我要把大象装冰箱,但是门别关,敞着就行,那就:
向冰箱下达「开门」的命令。
向大象下达「进冰箱」的命令。
是不是很方便?冰箱也可以换,我可以换成任何东西,只要实现了这个接口,这些东西就都有这些能力,那我才不管里面到底怎么实现的呢,直接下达【开门】【关门】命令即可。
这就是面向过程和面向对象编程的区别,也顺带地理解了什么是面向接口编程。这是学习JAVA最基础也是最核心的点。
整理自:
https://tryenough.com/java05
http://www.woshipm.com/pmd/294180.html
......