游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

JAVA冷知识JAVA居然支持多继承吗?让我们用内部类去实现

  写在前面JAVA冷知识,今天和小伙伴分享的是通过内部类的方式实现JAVA的多继承一个Demo和JDK源码中的具体场景部分内容参考《编写高质量代码(改善Java程序的151个建议)》《EffectiveJava》中文版第3版博文理解有误的地方小伙伴留言私信一起讨论
  与亲近之人不要说气话,不要说反话,不要不说话。烽火戏诸侯《剑来》
  众多周知,对于面向对象语言来讲,JAVA是不支持多继承的,只支持单继承,但是提供了接口来补偿。
  在实际的项目中,接口更多的用于行为的委托,把类本身一些是共性但又是特定的行为委托给一个接口的具体实现,当然接口也可以用于属性的委托,对象结构型的设计模式大都采用接口的方式来实现对对象内部组成的注册和操作
  如果实现java的多继承,其实很简单,关键是对于内部类的特征的掌握,内部类可以继承一个与外部类无关的类,保证了内部类天然独立性,根据这个特性从而实现一个类可以继承多个类的效果
  下面我们看一个Demo,声明父母两个接口,实现父母两个类,看如何通过内部类来继承父母类,而不是通过,接口委托的方式,一个Demo
  父亲接口packagecom。liruilong;Projectname:workspackPackage:com。liruilongDescription:父亲接口Author:1224965096qq。comWeChatOfficialAccounts:山河已无恙blog:https:liruilong。blog。csdn。netDate:20222122:48publicinterfaceFather{return:intDescription强壮的行为authorLiRuilongdate20222122:49intstrong();}
  父亲实现类packagecom。liruilong;Projectname:workspackPackage:com。liruilongDescription:父亲类Author:1224965096qq。comWeChatOfficialAccounts:山河已无恙blog:https:liruilong。blog。csdn。netDate:20222122:51publicclassFatherImplimplementsFather{staticpublicStringheight身体超高;return:intDescription强壮值authorLiRuilongdate20222122:51Overridepublicintstrong(){return8;}}
  母亲接口packagecom。liruilong;Projectname:workspackPackage:com。liruilongDescription:母亲接口Author:1224965096qq。comWeChatOfficialAccounts:山河已无恙blog:https:liruilong。blog。csdn。netDate:20222122:50publicinterfaceMother{return:intDescription温柔的行为authorLiRuilongdate20222122:50intKind();}
  母亲实现类packagecom。liruilong;Projectname:workspackPackage:com。liruilongDescription:母亲类Author:1224965096qq。comWeChatOfficialAccounts:山河已无恙blog:https:liruilong。blog。csdn。netDate:20222122:51publicclassMotherImplimplementsMother{staticpublicStringpretty脸蛋特别漂亮;return:intDescription温柔值authorLiRuilongdate20222122:51OverridepublicintKind(){return8;}}
  OK,准备工作做好了,看我们如何实现。packagecom。liruilong;importjava。util。logging。Logger;Projectname:workspackPackage:com。liruilongDescription:孩子类Author:1224965096qq。comWeChatOfficialAccounts:山河已无恙blog:https:liruilong。blog。csdn。netDate:202221213:16publicclassSonextendsFatherImplimplementsMother{staticLoggerloggerLogger。getAnonymousLogger();MotherSpecialmotherSpecialnewMotherSpecial();Overridepublicintstrong(){returnsuper。strong()1;}OverridepublicintKind(){returnmotherSpecial。Kind();}OverridepublicStringtoString(){returnSon{heightheight,prettyMotherSpecial。pretty};}publicclassMotherSpecialextendsMotherImpl{OverridepublicintKind(){returnsuper。Kind()1;}}publicstaticvoidmain(String〔〕args){SonsonnewSon();logger。info(son。toString());logger。info(son。strong());logger。info(son。Kind());}}
  我们用内部类继承一个外部类无关的类,实现了Son类的多继承Badlevelvalueforproperty:。levelBadlevelvalueforproperty:java。util。logging。ConsoleHandler。levelCantsetlevelforjava。util。logging。ConsoleHandler二月12,20222:02:06下午com。liruilong。Sonmain信息:Son{height身体超高,pretty脸蛋特别漂亮}二月12,20222:02:06下午com。liruilong。Sonmain信息:9二月12,20222:02:06下午com。liruilong。Sonmain信息:7Processfinishedwithexitcode0
  这里只是讨论这样的写法,我个人认为,这种方法有些鸡肋。这种方式实现的多继承,完全可以通组合的方式来实现,我们简单分析一下优缺点优缺点分析优点:
  通过内部类的方式,把继承关系控制在类的内部,理论上比通过组合的方式更加安全,代码可读性要好一点。
  更符合设计原则中的迪米特法则,又称最少知道原则(DemeterPrinciple),一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。缺点:
  首先通过继承的方式实现,打破了类的封装性,子类依赖于其超类中特定功能的实现细节。超类的实现有可能会随着发行版本的不同而有所变化,如果真的发生了变化,即使子类的代码完全没有改变,但是子类可能会遭到破坏因而,子类必须要跟着其超类的更新而演变,除非超类是专门为了扩展而设计的,并且具有很好的文挡说明。
  其次,通过这样的方式实现的,不符合常态思想,尤其内部类同名的情况,容易被忽略某些特性(见JDK源码)。JDK源码中的运用
  关于通过内部类来实现java多继承的JDK场景,我们简单分析一下asListListIntegerintegersArrays。asList(1,2,3);
  这个代码小伙伴们一定不陌生,这里通过Arrays工具类来生成一个List,但是这里的List并不是真正的ArrayList,而是在Arrays工具类内部定义的一个继承了AbstractList的静态内部类ArrayList,这里java通过内部类的方式巧妙的实现了。。。。。。。。SafeVarargsSuppressWarnings(varargs)publicstaticTListTasList(T。。。a){returnnewArrayList(a);}serialincludeprivatestaticclassArrayListEextendsAbstractListEimplementsRandomAccess,java。io。Serializable{privatestaticfinallongserialVersionUID2764017481108945198L;privatefinalE〔〕a;ArrayList(E〔〕array){aObjects。requireNonNull(array);}。。。。。。。。。。。。。。。。。
  但是这里同样需要注意的是通过内部类实现多继承要考虑其类的特殊性:
  这样生成的List调用add方法会抛不支持的操作的异常,基于Arrays的ArrayList是一个静态私有内部类,除了Arrays能访问以外,其他类都不能访问,正常的ArrayList中add方法是ArrayList父类提供,Arrays的内部类ArrayList没有覆写add方法。
  下面源码为ArrayList静态内部类实现的个方法。serialincludeprivatestaticclassArrayListEextendsAbstractListEimplementsRandomAccess,java。io。Serializable{privatestaticfinallongserialVersionUID2764017481108945198L;privatefinalE〔〕a;ArrayList(E〔〕array){aObjects。requireNonNull(array);}Overridepublicintsize(){returna。length;}OverridepublicObject〔〕toArray(){returna。clone();}OverrideSuppressWarnings(unchecked)publicTT〔〕toArray(T〔〕a){intsizesize();if(a。lengthsize)returnArrays。copyOf(this。a,size,(Classlt;?extendsT〔〕)a。getClass());System。arraycopy(this。a,0,a,0,size);if(a。lengthsize)a〔size〕null;returna;}OverridepublicEget(intindex){returna〔index〕;}OverridepublicEset(intindex,Eelement){EoldValuea〔index〕;a〔index〕element;returnoldValue;}OverridepublicintindexOf(Objecto){E〔〕athis。a;if(onull){for(inti0;ia。length;i)if(a〔i〕null)returni;}else{for(inti0;ia。length;i)if(o。equals(a〔i〕))returni;}return1;}Overridepublicbooleancontains(Objecto){returnindexOf(o)!1;}OverridepublicSpliteratorEspliterator(){returnSpliterators。spliterator(a,Spliterator。ORDERED);}OverridepublicvoidforEach(Consumerlt;?superEaction){Objects。requireNonNull(action);for(Ee:a){action。accept(e);}}OverridepublicvoidreplaceAll(UnaryOperatorEoperator){Objects。requireNonNull(operator);E〔〕athis。a;for(inti0;ia。length;i){a〔i〕operator。apply(a〔i〕);}}Overridepublicvoidsort(Comparatorlt;?superEc){Arrays。sort(a,c);}}
  即没有实现add和remove方法,所以asList返回的为一个长度不可变的列表,数组为多长转换为列表为多长,即不在保持列表动态变长的特性。subList
  嗯,不多讲,直接上代码ArrayListarrayListnewArrayList();LinkedListlinkedListnewLinkedList();VectorvectornewVector();linkedList。subList(2,3);arrayList。subList(2,3);vector。subList(2,3);
  List提供一个subList方法,与String的subString有点类似,这里的List通过subList生成子list方式也是通过内部类继承方式的多继承实现的。
  当然这里,具体需要分析,ArrayList和其他List的实现的方式略有不同
  ArrayList是自己定义的内部类SubList继承AbstractList实现的publicclassArrayListEextendsAbstractListEimplementsListE,RandomAccess,Cloneable,java。io。Serializable{。。。。。。。publicListEsubList(intfromIndex,inttoIndex){subListRangeCheck(fromIndex,toIndex,size);returnnewSubList(this,0,fromIndex,toIndex);}。。。。。privateclassSubListextendsAbstractListEimplementsRandomAccess{privatefinalAbstractListEparent;privatefinalintparentOffset;privatefinalintoffset;intsize;。。。。。。。。。
  LinkedList的subList方法是由AbstractList实现的,它会根据是不是随机存储提供不同的实现方法,subList返回的类也是AbstractList的子类SubList。publicabstractclassAbstractListEextendsAbstractCollectionEimplementsListE{。。。。。。。。publicListEsubList(intfromIndex,inttoIndex){return(thisinstanceofRandomAccess?newRandomAccessSubList(this,fromIndex,toIndex):newSubList(this,fromIndex,toIndex));}classSubListEextendsAbstractListE{。。。}classRandomAccessSubListEextendsSubListEimplementsRandomAccess{。。。。。。。}。。。。。。。。}
  这里需要注意的是,不管是ArrayList还是LinkedList等其他List,通过SubList内部类生成的List,其所有的方法(get,add,set,remove等)都是在原始列表上操作的,它自身并没有生成一个数组或是链表,也就是子列表只是原列表的一个视图(View),所有的修改都反映在原列表上。

简单几步,教你轻松恢复微信聊天记录安卓手机:微信删除的聊天记录怎么恢复1、将手机连接电脑,并打开微信聊天记录的储存位置。微信聊天记录目录路径为encentMicroMsg一长串字符的文件夹(微信账户)……三大电信运营商前三季净利润超千亿5G渗透率提升近日,三大电信运营商的三季报渐次披露,业绩表现抢眼。据计算,三大运营商前三季度净利合计达1162。03亿元。展望未来,东吴证券认为,当前运营商业绩呈现逐季度加速态势,在5G渗透……网约车市场将再次洗牌据官方统计,一月份按订单合规率(指驾驶员和车辆均获得许可的订单量占比)从高到低的分别是享道出行、妥妥E行、如祺出行、阳光出行、携华出行、T3出行、及时用车、蓝道出行、神州专车、……数控车床宏程序的控制语句以及逻辑解析宏程序流程控制和循环语数控车床宏程序与普通程序有什么区别呢?第一个就是流程控制普通程序在执行的时候,它总是从第一段开始依次执行到最后一段程序结束,中途不改变执行顺序……金力永磁(300748。SZ)拟与金风科技开展绿色电力合作事智通财经APP讯,金力永磁(300748。SZ)公告,公司拟与金风科技及其附属公司开展绿色电力合作事项,合作地点包括但不限于公司赣州工厂、包头工厂、宁波工厂。具体合作方式包括但……新春走基层农民网上卖年货备年货渐成风尚来源:新华网寒冬腊月,随着百誉智能物流专车的到来,湖北省宜昌市长阳土家族自治县都镇湾镇响石村村民易发元在村里的快递物流服务站,收到了孩子从广东省珠海市寄回来的年货包裹,易……商务部发言人就美撤销中国联通在美214电信运营牌照发表谈话针对美国联邦通信委员会发布命令撤销中国联通公司在美214电信运营牌照,商务部新闻发言人28日发表谈话说,美相关部门泛化国家安全概念,滥用国家力量,在缺乏事实依据的情况下再次恶意……未来机器人可能替代人类吗?科技迷这样说相信不少人都看过关于机器人的科幻电影,也对里面很多科幻情节印象深刻,比如当人工智能发展到一定程度时,人类可以和各种不同设计的机器人共同生活。而随着科技的进步,类似这样的场景或许……最近刷爆新能源汽车圈的国补退坡究竟是什么国补退坡巨浪来袭最近,很多小伙伴的朋友圈开始被国补、退坡等关键词刷屏了。大家可能听说过,新能源汽车行业掀起了一阵巨浪。这场名为国补退坡的巨浪,对于今年有意购买新能源汽车的……汽车不实用的5个配置基本就不用选车并不是配置越多就越好,配置越多故障率可能就越高。今天就分享5个不实用的汽车配置。第壹个就是车载导航。说实话,现在很少有人用自带的导航了。主要原因是手机导航比它好……电池限制了我们对智能产品的想象力爱否精选事实上,锂离子电池被大规模商业应用的历史并不长。如今我们距离锂离子电池在硬件产品上的第一次爆炸事件,才仅仅过去了30年,而造成那次悲剧的锂枝晶现在依然是电池研发人……苹果ABF载板需求预计翻倍,供应缺口或延至2025年用量高于此前预估的一片。今日重要性:天风国际分析师郭明錤在最新报告中表示,每部AppleARMR头戴装置将配备由4奈米与5奈米生产的双CPU,且双CPU均采用ABF载板。CPU……
a16z为美国政府提议去中心化友好的监督制度链得得(微信号:ChainDD)10月06日讯,据CoinDesk报道,风险投资公司AndreessenHorowitz(a16z)提出了美国政府可以管理加密货币和区块链技术的……人类大脑是一条机器狗很想要分享最近在看的一篇文章,来自丹麦奥胡斯大学认知科学的MikkelWallentin写的,人类大脑是一条狗,也许是条机器狗。这篇文章主要讲的呢是人类的大脑和意识。随着……华为HarmonyOS2系统发布!网友牛逼LOGO大师整理编辑(ID:logods)图片来源:HarmonyOS官微、华为官微部分资料参考:华为官方还记得在2019年美国宣布禁止华为使用安卓系统……被网友锤爆?opporeno6拿什么反击近日,oppo发布了新机,OPPOreno6系列手机。对此很多网友都说OPPOreno6系列手机,看了价格后,很多网友都说不香了。那么事实是怎么样的呢。就拿oppo……苹果13和苹果12性能对比到底谁更香?苹果发布会后,很多人直夸苹果业界良心,13增量又降价,13真的香!可13真的香么?我给准备购买iphone13的用户带来灵魂三问,看完你再问问自己13到底香不香。1……新能源,我们要细化行业知识颗粒度新能源在汽车市场可以说是非常或火爆,引起很多消费者的关注,近期,孟浩身为鹏华基金的工作人士,对新能源知识给了一些分享,看看他是如何寻找当时最具活力的资产的。新能源投资需要……又一国产5G巨头杀出?入局德国5G市场,雷军这次究竟在下什么这也叫5g巨头?大家都知道,经过了将近10年的努力,小米公司再一次超越苹果,成为了全球第三大智能手机品牌,目前我国的华为和小米直接是占据了全球前三的两个位置,但是目前华为……天融信一季报营收增长逾四成技术创新聚焦新场景4月29日晚,天融信(002212)发布2022年一季报,报告期内,公司实现营业收入3。78亿元,同比增长42。80;毛利率为67。64,同比上升7。69个百分点。期间费用总计……标题党真恶心,应该严惩随着互联网产业的迅速发展,现在的社交平台是越来越多。而进入社交平台的门槛儿也越来越低。因为注册一个社交平台账号很容易,它不需要任何工作经验,不需要任何学历,更不需要任何资金。大……时隔1269天,魅蓝回归,魅族再一次推翻了自己魅族正在不断推翻自己。今年3月,魅族18系列发布会上,魅族官方高调宣布:从18系列开始,魅族将放弃新产品的互联网广告营收,为消费者提供真正的纯净硬件、纯净系统,打造……怎么看待现在的今日头条?没有头条的时候,下着无聊看看百度,不管查什么都是百度,自打有了头条,就感觉头条新闻,生活、娱乐什么都有而且都是新鲜出炉,他有文章、微头条,视频、小视频,问答,形式多样化,想查什……华为P50上市被迫继续延期特斯拉法务部私信警告自媒体热点聚焦1。【华为发布P50系列手机,暂未公布具体上市日期】华为正式发布HarmonyOS2及多款搭载HarmonyOS2的新产品。华为手机、平板等百款设备将陆续启动升级……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网