• <big id="cnnue"></big>
    <legend id="cnnue"><sup id="cnnue"></sup></legend>
    <legend id="cnnue"><dl id="cnnue"></dl></legend><ol id="cnnue"><input id="cnnue"></input></ol>
    1. <big id="cnnue"></big>
      <var id="cnnue"></var>

    2. <ol id="cnnue"><output id="cnnue"></output></ol>
    3. 当前位置:首页 > 电脑IT培训 > java培训资讯

      我是如何理解Java抽象类和接口的

      来源: 发布时间:04-03

        在面试中我们经常被问到:Java中抽象类和接口的区别是什么?

        然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦;一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好像把标准答案熟练的说出来一样。

        抽象类和接口这篇文章讲到了他们的区别和联系,它们确实有很多相似的地方,但是从本质上看,或从语言的设计角度来看,这不是它们最本质的区别。

        不卖关子,我个人对这两个的理解:

        类是具体实例的抽象,比如一个json字符串的抽象;而抽象类就是类的抽象;接口就是抽象类的抽象,接口更像是一种协议

        听我慢慢道来~

        吐槽

        首先,我必须吐槽一下这种面试,我认为面试官凡事问出这种类似“说说抽象类和接口的区别”,“说说进程和线程的区别”等等问题,都是不负责的表现。

        为什么呢?

        一个原因就是,面试官对想要招的人完全没有自己的评价标准,另一个原因就是对面试者不负责。这种问题根本不能考验面试者的水平。

        那么,如果我来面试别人,我会问:请你说说你怎么理解抽象类和接口;如果要你向你外婆解释进程和线程的区别,你会怎么解释?

        我觉得这可以考验面试者对问题的理解程度,我想微软的面试题(你如何向你奶奶解释Excel)一样,考验一个人对某一事物的理解程度(虽然,至今我还不能很好的想明白这个问题 -。-)

        抽象类和接口的区别

        说到抽象类和接口,就必须要说到类。

        一个类就是对现实事物的抽象。

        比如定义一个BenzCar类,就需要对现实的奔驰汽车有很好的抽象(当然奔驰汽车有好多系列,这里不钻牛角尖)。也就是说如果你要造一辆奔驰汽车,就需要BenzCar这个类(这辆奔驰汽车就是内存中的一个Instance)。

        那么抽象类就是对类的抽象。

        怎么理解呢?就是说有很多汽车厂商一起定义一种规范(Car类),说要造一辆汽车就需要有发动机,轮胎,音响设备…(这些就相当于抽象方法),具体用什么发动机,轮胎,音响设备由每个汽车厂商自己去完成。这样就有各种汽车了,奔驰牌的,宝马牌的,丰田牌的…

        接口就是对抽象类的抽象

        这只是我个人的理解。

        在我们日常生活中可以看到各种“接口”,电源插座就是一种。开始我是看到耗子叔的博客在开始理解“控制翻转”这个概念的——IoC/DIP其实是一种管理思想| 酷壳- CoolShell.cn。后来我就想,这个东西其实无处不在,制造电源插座的厂和制造电器的厂只要约定一种“接口”——两口插座或三口插座,当然每个国家的接口都不一样,不同接口之间的转换就需要用适配器了。

        其实程序中也一样,比如所有的交通工具可以抽象为一个接口Drivable(可能由于经验原因,我考虑的不是很完善),表示实现这个接口的类创建的对象(比如:汽车,飞机,轮船等等)都是可以驾驶的

        public interface Drivable{ public void drive();

        }

        然后,我们就可以创建一个AbstractCar类,表示这个对所有汽车类的一个抽象,所有可以驾驶的汽车都必须继承这个类,这个抽象类中规定了一些抽象方法,比如getEngine()方法,这说明每种汽车的引擎都不太一样,需要在子类中自定义(当然,你也可以继承AbstractCar类,对所有可能具有相同引擎的汽车进行一层抽象)。

        为什么对Drivable的drive()方法进行了默认实现,但是默认实现中却直接抛出了异常呢?

        其实这是一种实现接口的方法,还有一种方法就是将drive()设为abstract。这两种实现方式,我觉得从功能上讲是一样的,但是从类设计上讲是不同的。

        下面代码中的实现,我是参考了java.util.AbstractList中add(int location, E object)方法的设计,它的文档中写到:

        * @throws UnsupportedOperationException

        * if adding to this List is not supported.

        public abstract class AbstractCar implements Drivable { public abstract Engine getEngine(); public abstract Wheel getWheel(); @Override

        public void drive(){ throw new UnsupportedOperationException();

        } // 省略其他方法和属性}

        那么上面这段代码中的drive()可以理解为:

        默认情况下“汽车”是不能开的,你实现了一个汽车类后,需要Override这个方法,实现自己的drive方法

        以java容器中的List举例

        20180328105348_657.jpg

       

        到源码里面找,你就会发现List的继承关系最顶层的就是Iterable,就表示说List是可以遍历的,而且它还会产生一个Iterator接口对象。这表示一个列表可以通过这个迭代器来遍历。

        这就像上面说的,所有的交通工具都是可以驾驶的一样,所有的列表都是可以遍历的。

        一层一层往下,类就变得更加具体。

        最后

        为什么接口可以继承?

        其实这个原理很简单。因为总有一个最本质的协议来约束大家,比如所有的交通工具都是可以驾驶的,所有的容易都是可以遍历的。然后协议会渐渐变得更加具体:

        Iterable <- Collection <- List <- AbstractList <- List

        从下往上看,就是一层比一层抽象。

        就像我在文章开头说的,

        你用ArrayList类可以创建很多个对象,ArrayList就是这些对象的一次抽象

        而AbstractList是对ArratList的一次抽象,你用AbstractList可以创建ArrayList,也可以创建Stack,或LinkedList等

        List接口就是对所有的列表类的抽象

        Collection就是对所有单一元素的容器的抽象

       

        Iterable就是一个最高层次的抽象了,表示所有的容器都是可以遍历的

      特别声明:由于各方面情况不断调整与变化,贵州育路网所提供的考试信息仅供参考,请考生以权威部门公布的正式信息为准。

      返回顶部
      本港台开奖现场直播在线-本港台开奖现视频直播-本港台开奖直报
      m.2121buy.com m.304496092.com m.52chendumeishi.com m.52qqcz.com m.7568872.com m.99vv340.com m.agag70.com m.anpinglansai.com m.asshishicai.com m.baoshidamall.com m.bjoso.com m.bocdima.com m.bxxyzl.com m.cdjutaiedu.com m.cl1899.com m.cpexe.com m.cztxhg666.com m.diejuji66.com m.dmgjzx.com m.dphhw.com m.elitecld.com m.esexfree.com m.ezupdos.com m.fanfan-zone.com m.fengwoyidong.com m.getfault.com m.hcxiangjiao.com m.hf556.com m.hongfushangmao.com m.huibobet.com m.hyhatch.com m.hzybqh.com m.ibroyeur.com m.jiangyaqing.com m.ksuca.com m.liangdianjiaoyu.com m.lovegwu.com m.mayihuobang.com m.miaoxiangshike.com m.miiqin.com m.modelslimming.com m.msjyhs.com m.mysoushou.com m.myteenssex.com m.nanahey.com m.o48d.com m.o8jw.com m.pzsyr.com m.qgbrs.com m.rbrbt.com m.rfynq.com m.rqwdt.com m.rxbled.com m.rxdmn.com m.sct-ys.com m.sdyxtjy.com m.spark-eo.com m.spyware-pcrisk.com m.sxlrr.com m.syhrzg.com m.tadeyijia.com m.tengjingkj.com m.tiantianoa.com m.tykjr.com m.uxf7.com m.weakbug.com m.wgppd.com m.xajyz.net m.xiqidai.com m.yczszw.com m.youxiaad.com m.yue8888.com m.yzkths.com m.zqbf137.com m.zqssc05.com m.zsbxp.com m.zspxk.com m.zsxscj.com www.88366666.com www.942dn.com www.lottimes.com www.opc32.com www.ss-tm.com www.tiaopigui.com www.xmyinhe.com www.mfkof.com www.upsbbs.com www.gzesmb.com www.niqzone.com www.m-instyLe.cn m.1yguz.com m.2huoo.net m.51bpbpz.net m.53zy.net m.5ecn.net m.91youhui.net m.adospados.com m.afty.net m.afzn.net m.baobeiqianbao.net m.bestmeet.net m.bjbna.net m.bjkjwj.net m.cg365sc.net m.cnyntq.net m.congdash.net m.coybcs.net m.csoug.net m.dijier.net m.djhsc.net m.donghuiwan.com m.dsi-ag.com m.dzshgwx.net m.eamoy.net m.ecopote.com m.ehuiche.net m.eiconf.net m.eimeeting.net m.ez-ns.com m.freshkpop.net m.gaoxiaoduanzi.net m.glxiduobao.com m.guiqin.net m.guogai.net m.gydushu.com m.haokan5.net m.hltjq.net m.hshardcover.com m.huangjinnc.com m.huangzhe0910.com m.i517.net m.icauto.net m.ijiawei.net m.iyaorao.net m.iyuwei.net m.izxs.net m.jlskjk.com m.jnrstc.com m.jnxins.com m.joinchampions.com m.jsywym.net m.juezhe.net m.julisports.net m.kardon023.com m.keiee.net m.kkdb168.com m.ksb120.net m.kzbiz.net m.laziw.com m.lcoder.net m.lefuxx.com m.live-cam4sex.com m.louboutinb.com m.ly568.net m.matengfei.net m.mblabc.net m.mcmcmc.net m.meitwo.net m.miyueing.com m.mjrgb.com m.mmd47.com m.mms39.com m.nanjingwx.com m.naodongxueyuan.com m.ncwywk.com m.neimengguly.com m.newcityvr.com m.newhnwg.com m.ngzrb.com m.nianlai.net m.niuhuotong.com m.nj142.com m.nmgmmw.com m.nnwsn.com m.nongtaifruit.com m.npymh.com m.nqbcs.com m.nwezq.com m.oe2pq.com m.p950r.com m.panoad.net m.papasj.com m.pcfordlm.com m.pinkypunk.com m.pojox.net m.popo365.net m.portalfan.net m.qhy360.com m.qinghuayingyu.com m.qingjiankeji.com m.qirongzhongchou.net m.qiutianzichan.com m.quanminkuaiduobao.com m.quansiweizhiyuan.com m.readc.net m.rpocr.net m.sdell.net m.sdhzz.net m.senrijin.com m.shangzewangluo.com m.shanmeme.com m.shanrenzixunjituan.com m.shengwh.com m.shengzhiqi.net m.shfongwei.com m.shiguangji888.com m.shiyihui.net m.shop666.net m.shoppniac.com m.shyarun.com m.softsweet.net m.sxsgky.net m.szifresh.com m.tahuyu.net m.taiyear.net m.taowogo.com m.taxionghaizi.com m.thirftyfun.com m.tiqianme.com m.tjcbmy.com m.tjynet.com m.tyc1413191.com m.v-liandong.com m.v-quick.net m.vrwar.net m.walyy.net m.we30.net m.weixd.net m.wenancn.net m.wetrussian.com m.wuaimei.net m.wuyutong.net m.wzj0759.com m.xianyoujie.com m.xiaolangli.com m.xiaolieai.com m.xiawangshipin.com m.xiyuesh.com m.xuanf.net m.xyflower.net m.xzcit.net m.yifoobao.net m.yjhzttjq.com m.yjk1997.com m.ylmov.net m.yongyijinfu.com m.yueguoji.net m.zhansen8.com m.zhaokuandai.com m.zhc-nj.com m.zhongruiedu.com m.zivdoll.com m.zjjyjn.com m.zmkaolu.com m.zmtbs.com m.zmysjh.com m.zzfreemaker.com