黑马程序员技术交流社区
标题: 一个现实中的例子理解对象,对象变量,... [打印本页]
作者: hoyouly 时间: 2013-8-21 09:02
标题: 一个现实中的例子理解对象,对象变量,...
今天复习java变量与对象变量的关系那块的时候,突然想起来一个很有意思的例子,来帮助我理解这两个之间的关系,给大家分享一下。
对象和对象变量的关系,感觉有点像是驾照和汽车之间的关系。
对象类型有很多,这就相当于有很多功能的汽车,什么轿车是用来载人的,卡车是用来拉货的,大巴士用来拉人的。
对象有很多,就相当于有很多牌子的汽车,什么宝马奔驰,小卡,宇通等。
变量的类型也有很多,这就相当于驾照分A类,B类,C类,(没有细划分,能说明问题就行)
什么类型的变量引用相应类型的对象,这就相当于什么类型的驾照开什么类型的车,A类驾照开大巴车,B类驾照开卡车,C类驾照开轿车,至于B类驾照也能开轿车,这个类似于多态,后面会说到,暂时先搁到一遍。
对象是由构造器创建的。对象变量不是对象,
对象变量并没有实际包含一个对象,而仅仅是引用一个变量。
这就相当于汽车是由汽车厂生存出来的,拥有驾照并不等于你就拥有一辆车,你拥有的仅仅是开车这个权利。
不同的是:创建一个对象和对象变量都很简单,创建对象只需要 在构造函数前面加上操作符new就可以了,例如创建一个日期对象:new Date();
创建一个对象变量很简单,只需要在对只需要在变量名前加上类名就可以了,例如:创建一个日期变量:Date d 。
而生产一辆汽车则需要很多流程,严格把关,考驾照更需要层层考核,麻烦。
接下来说对象与对象变量的关系:
首先,你的有对象才能被对象变量引用,没有对象,你就算是有一个对象变量也是白搭,这就相当于得先有车,你才能开,没有车,即使你A类驾照,也是白搭,
其次:对象变量类型必须与对象类型匹配,不然编译器会报错。这就相当于你要开什么车,得有什么驾照,违法的事咱们不干。
对象变量只与对象类型有关,和对象之间只存在引用与否。这就相当于现在有一辆车,不管是保时捷,兰博基尼,法拉利等跑车,还是别克,奔驰等商务区,或者是二手奥拓,桑塔纳,出租车等普通的车,只要属于轿车,并且没有出现毛病(创建对象失败),你就能拿着C类驾照去开这辆车。这和车的牌子新旧没有任何关系,决定能不能开的就是你的驾照这个车的类型是否匹配和是否存在这样一辆车。有驾照匹配,并且这辆车没有毛病,你就能开。对象变量和对象类型匹配,并且已经创建好这个对象,你就能引用这个对象。
对象变量有了,对象也有了,并且匹配,那就引用吧,这就相当于你拥有了驾照,旁边还有一辆轿车,想开这辆车,上车就行就行了。可对象变量怎么引用对象呢?对象变量要想引用对象,必须是通过“=”这个操作符来完成的,即:d=new Date();
如果你不引用对象,那么你就不能操作这个对象,这就相当于如果你不上车,即使你拥有驾照,你还是操作不了这个车的,不管你是什么类型的驾照,
对象变量引用对象后,就可以对这个对象进行操作了,即调用对象相应的方法完成某些功能,但是这些功能并不是属于对象变量的,而是属于对象本身的,对象变量仅仅是调用这些方法。这就相当于你上车后,就可以对车进行相应的操作了,例如让汽车启动的,停止的,鸣笛的,但是这些功能是并不是属于你的,而是属于汽车的,你只是拥有使用操作他们的权利。
对象变量可以指向另一个对象变量,例如:再定义一个日期对象: Date d1;那么d1也可以指向d这个对象变量,即 d1=d;这个意思是d和d1这两个对象同时指向 new Date()这个对象,也就是说
如果有一个人拥有C类驾照的人上了这辆车,但是你同样也可以开这辆车,你们两个同时拥有操作这个车的权利
接下来说一点关于多态的理解:
多态就是: 父类的引用指向了自己的子类对象。换种说法就是:父类的引用也可以接收自己的子类对象。
多态的前提:必须是类与类之间有关系。要么继承(extends),要么实现(implements)。
通常还有一个前提:存在覆盖。如果不存在覆盖,那么多态就没有意义了。
多态的特点:成员函数在多态调用时,编译看左边,运行看右边。
我们都知道,B类驾照可以不但可以开卡车,还可以开轿车,这个就类似于现实中的继承。卡车继承了轿车的功能(启动,停止,鸣笛),(相当于轿车的子类),只不过在轿车的基础上扩展了一些功能,比如可以拉货等,也就是说如果你拥有B类驾照,那么C类驾照能开的车你完全能开,这就相当于多态,即父类的引用指向了自己的子类对象。
如果你即想开卡车,有想开轿车,那么拥有一个B类驾照就可以了,但前提是你必须得有C类驾照才能考B类驾照,这就相当于类之间有关系,才能多态,
如果父类的引用指向了子类对象,也就是说你拿着B类驾照上了轿车,你操作的是轿车的方法,例如启动,停止,鸣笛等,但是你却不能因为自己是B类驾照,就说要操作轿车去拉货吧,(假定拉货这个功能轿车没有,卡车有,实际上轿车也能拉点货的,尽管不是很多,但是可以,)因为轿车根本就没有这个功能,你怎么去拉货啊,这和多态的特点:成员函数在多态调用时,编译看左边,运行看右边很像,
你能不能操作这个车,先看你的驾照,(即左边的对象变量)一看你的是B类驾照,开的是轿车,符合要求,编译通过,即:编译看左边,但是你上的是轿车,即你只能操作属于轿车的功能,即运行看右边。
这就是一点关于对象,对象变量,继承和多态的理解。由于本人水平有限,文笔不好,理解表达中可能会存在偏差,尤其是解释多态特点这段,可能会出现混淆但我感觉应该能对理解这几个概念或多或少有些帮助,希望读者不要仅仅计较。
注:一家之言,不喜勿喷
作者: jrry 时间: 2013-8-21 09:06
好长,楼主好辛苦打了这么多字。。
虽然不知道写的什么,也给个鼓励。。{:soso_e142:}
作者: 645420297 时间: 2013-8-21 23:02
加油,如果能用几句话表达出中心思想就更好了
作者: hoyouly 时间: 2013-8-22 06:22
对象相当于汽车,变量相当于驾照,多态就相当于拿着B类驾照可以开轿车,大概就是这个意思。
作者: 梦想蓝色天空 时间: 2013-8-22 08:33
楼主辛苦。。顶一个。。
作者: 645420297 时间: 2013-8-23 23:13
级别越高权限越大吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |