专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

浅谈多态中的向上转型与向下转型

  向上转型概念明细
  【原理】:实际就是创建一个子类对象,将其当成父类对象来使用。
  语法格式:父类类型对象名new子类类型()AnimalanimalnewCat(元宝,2);animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换复制代码以下是定义的父类Animal类它的两个继承类Cat类和Dog类,分别重写了Animal类的eat()方法classAnimal{Stringname;intage;publicAnimal(Stringname,intage){this。namename;this。ageage;}publicvoideat(){System。out。println(age岁的name正在吃东西);}}classCatextendsAnimal{publicCat(Stringname,intage){super(name,age);}Overridepublicvoideat(){System。out。println(age岁的name正在吃猫粮);}}classDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}Overridepublicvoideat(){System。out。println(age岁的name正在吃狗粮);}}复制代码
  使用场景1:直接赋值以下这种就是直接赋值类型的向上转型,将子类对象的引用给到父类对象。然后再将这个对象作为参数传递进去,就可以根据不同引用调用不同的行为publicclassTest1{publicstaticvoideat(Animalanimal){animal。eat();}publicstaticvoidmain(String〔〕args){Animalanimal1newAnimal(动物,3);Animalanimal2newCat(加菲猫,2);Animalanimal3newDog(哈士奇,1);eat(animal1);eat(animal2);eat(animal3);}}复制代码
  使用场景2:方法传参第二种方法传参很简单,我们连对象都不需要创建,只需要直接将三种不同对象的引用作为实参传递给到eat()中的形参接受,就可以产生【向上转型】publicclassTest1{publicstaticvoideat(Animalanimal){animal。eat();}publicstaticvoidmain(String〔〕args){eat(newAnimal(动物,3));eat(newCat(加菲猫,2));eat(newDog(哈士奇,1));}}复制代码使用场景3:方法返回第三种便是在一个方法中将不同对象的引用进行返回,然后传递给到父类对象,也可以产生向上转型publicstaticvoideat(Animalanimal){animal。eat();}复制代码稍微讲一下这个方法,可以看到形参是String字符类型,在方法中通过判断外界传入进来的字符串然后对应地进行返回若是猫就返Cat对象的引用;若是狗就返Dog对象的引用;若是其他就返nullpublicstaticAnimalBuyAnimal(Stringvar){if(var。equals(猫)){returnnewCat(加菲猫,2);}elseif(var。equals(狗)){returnnewDog(哈士奇,1);}else{returnnull;}}复制代码Animalanimal1BuyAnimal(猫);eat(animal1);Animalanimal2BuyAnimal(狗);eat(animal2);Animalanimal3BuyAnimal(兔);eat(animal3);复制代码然后可以看到,前两个传入的是【猫】和【狗】,因此执行的便是不同对象的行为,但是在最后传入了【兔】,因此在BuyAnimal()方法中会returnnull这就使得传入eat()方法中去调用相关对象的行为时因为不存在这个对象的引用,所以就会产生空指针异常
  上述便是向上转型的三种场景。学会辨别和使用即可向上转型的优缺点
  【优点】:让代码实现更简单灵活,这个从上面的三个不同场景就可以看得出来【缺点】:不能调用到子类特有的方法比如说我在Dog类中写了一个它自己独有的方法lookdoor()classDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}Overridepublicvoideat(){System。out。println(age岁的name正在吃狗粮);}publicvoidlookdoor(){System。out。println(name在看门);}}复制代码但是可以看到,我在通过向上转型之后通过父类对象接受子类引用但是调用不到子类中特有的方法,这其实就是向上转型的缺陷
  【注意事项】上转型对象不可以访问子类新增的成员变量和子类自己新增的方法,因为这是子类独有的,而父类中没有上转型对象可以访问子类继承的方法或者是子类重写的方法,这个时候当上转型对象去调用这个方法时,一定是调用了子类重写后的方法,这就是我们前面在讲继承的时候所提到的方法重写不可以将父类创建的对象的引用赋值给子类声明的对象,也就是下面的这两句代码,这很明显和我们的上转型对象相反的,我们是将子类对象给到父类的引用,但这是将父类的引用给到子类的对象,完全就是颠倒黑白【就和猫是动物,动物却不是猫一个道理】向下转型
  接下去我们来讲讲向下转型,这种类型的转化不太安全,如果没有特殊需求,不建议使用向下转型解决【调用子类独有方法】继续上面的谈到的在向上转型之后无法调用子类独有的方法这个问题,其实向下转型就可以解决,代码如下Animalanimal1newDog(哈士奇,1);animal1。eat();animal1。lookdoor();Dogdog(Dog)animal1;dog。lookdoor();复制代码可以看到,也就是将父类的对象animal强转成为Dog狗类的对象,这样的话其实就可以去调用子类中特有的方法了
  向下转型的缺陷
  那为什么说向下转型不安全呢,因为它存在安全隐患Animalanimal1newCat(加菲猫,2);animal1。eat();animal1。lookdoor();Dogdog(Dog)animal1;dog。lookdoor();复制代码可以看到我将原先的Dog狗类变为了Cat猫类,此时animal就得到了猫类对象的引用,但是在下面可以看到如果将这个animal强转为Dog狗类的对象其实就会出问题了看到编译器报出了ClassCastException类型转换异常
  向下转型的优化
  向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换可以看到,在进行强转之前我通过instanceof这个关键字进行了一下判断,看看animal1是否获取到了Dog类的引用,若是才可以进行强制类型转化,若不是的话就不会进行任何操作Animalanimal1newCat(加菲猫,2);animal1。eat();animal1。lookdoor();if(animal1instanceofDog){判断一下animal1是否获取到了Dog类的引用Dogdog(Dog)animal1;dog。lookdoor();}复制代码
  如果对instance关键字感兴趣的可以看看官方的文档instanceof关键字
  再度对比二者【碎碎念】
  可能在上面这一系列说来有点难分辨,我们再来对比看看其实你可以这么去想Animalanimal1newCat可以看成是猫归属于一个动物类,那猫一定是属于动物的但是看到Dogdog(Dog)animal1其实就要去思考把动物归属于狗,这其实是说不通的,难道只要是动物就一定是狗吗?那可不一定,动物可多的是
  总结与提炼
  来总结一下本文所学到的内容在本文中我们讲到了多态中的【向上转型】与【向下转型】首先是说到了向上转型,介绍了它会出现的三种场景,也分析了它的优缺点,知道了在向下转型之后无法调用子类特有的方法但是在向下转型中,我们解决了这个问题,通过对父类对象进行一个强转,就可以调用到子类当中的方法,不过可以看到这种做法不太安全,若是一开始父类对象接受了一个子类的引用,但是在强转的时候转化为了另外一个子类,就会造成类型转换的问题于是后面对方法进行了修正,在前面加上了instanceof关键字进行一个判断,只有父类接收到了这个子类的引用,才可以强转为这个子类的对象
  原文链接:https:juejin。cnpost7205406121678225445

外星人讲述地球往事小行星撞击,造成地球第一波人类文明灭亡1987年6月,法国园丁师米歇受外星人涛邀请,进行了为期10天的星际旅行。在去海澳华星球的路上,涛给米歇讲了地球人类的往事,讲了黑种人之间的大撕裂带给他们的灾难,后来经过一段时间的人民日报每日金句青衿之志,履践致远,行远自迩,笃行不怠。在少年的时候要有志向,脚踏实地才能行稳致远,把基础打牢,这样才能走得更远。走远路的时候要从近处走起,不要懈怠,笃定前行,保持坚定不移的学习态重走芳华路畅游祖国东南彩云之南可是个好地方景好,人热情,气候温和尤其是是云南西南部因为临近边境线,更加迥异于祖国东部的风情更是令人迷恋!今天,咱们就来看看,怎样才能轻松的逛游云南!第1天昆明抚仙湖84公重庆仙女山的冬季北国风光,推荐几个拍雪景的地方仙女山景区位于重庆市武隆区,平均海拔大约1900米,最高海拔2033米,冬季都会有下雪的日子。仙女山平坦辽阔,拥有10万亩草原33万亩森林,白雪覆盖下的无垠草原和苍茫林海颇有北国风中国佛教四大名山之普陀山普陀山位于浙江舟山,原名梅岑山,相传为观世音菩萨教化众生的道场。普陀山现有普济寺法雨寺慧济寺三大寺院,56庵,16茅棚以及与之相连的莲花香道,明清以来具有较完整的海天佛国观音文化体非夫妻关系入住酒店,只登记了一人身份,查到后会有啥后果?随着现代社会的发展,大家都可以明显的感受到自己的生活水平是在不断提高的,而且其实大家现在对于享受生活这一个方面也是非常的追求的。换做在以前住酒店这件事情,肯定大家都非常的心疼,不愿慕田峪长城全程走下来几小时?巴士达官方攻略一慕田峪长城全程走下来要多久?二慕田峪长城的其他游览方式三慕田峪长城巴士达官方交通攻略四慕田峪长城的必去打卡点五游慕田峪长城的小贴士明洪武元年时,朱元璋手下大将徐达在北齐长城遗址上教训总结!去越南机票酒店差点全损了,入境越南签证避坑指南来了自今年10月越南正式开放以来,越来越多的游客通过自助申请电子签证或申请签证批文办理落地签的方式入境越南。办理途中,小伙伴遇到的问题也是层出不穷,到底先办签证还是先订机票?去越南可以准妈妈肚脐是凹进去或凸出来,情况可能不一样,早知早好大多数的女性朋友知道自己怀孕之后都变得无比的高兴和激动,那种初为人母的喜悦让他们感觉非常幸福,特别是到了怀孕中期的阶段孕妇能够感受到胎宝宝的胎动了,而且会时常抚摸孕肚和宝宝说话,感1948年,界首市的一些情况界首市的一些情况孙延岑1948年3月,在纸店区的一个村庄,住着中原局的一些负责同志,李雪峰刘子久等同志就在那里指导豫皖苏区的工作。当时,张柏园和我等十多个同志也住在这个村庄。不久中神舟十四号飞船落地后切主伞失败?可能真实情况并不是这个样子昨天晚上,倍受关注的三名航天员陈冬,刘洋,蔡旭哲乘坐神舟十四号飞船安全返回东风着陆场,看了电视直播,有细心的网友可能发现了神舟十四号飞船落地后主伞绳竟然没有切断,而是由地面工作人员
加兰德米切尔各22分骑士末节一波流送太阳6连败!NBA常规赛1月9继续进行,本场比赛太阳这边保罗布克卡梅隆约翰逊和佩恩全部缺阵。最终,骑士以11298战胜太阳,太阳遭遇6连败!首节开始,太阳上来先打出92开局。随后双方展开对攻,特雷杨308关键4分老鹰送快船6连败!莱昂纳德297NBA常规赛1月9日继续进行,本场比赛莱昂纳德复出,乔治缺阵。最终,老鹰以112108战胜快船,快船遭遇6连败。首节开始,曼恩上来连拿5分帮助快船70开局。随后双方你一球我一球连续32分21分27分,重返湖人不辱使命!威少说得没错,老詹需要你NBA常规赛激战正酣,许多球队渐入佳境。联盟当前风头最盛的球队不是西部霸主掘金队,也不是东部霸主凯尔特人队,而是从绝境中焕发新生的洛杉矶湖人队。湖人队的阵容有着先天性的缺陷,老的老中国足球又爆幺蛾子,太太团是主力!中国足球近期好热闹!球场上没有轰轰烈烈的比赛,而球场下却热闹非凡!如果这些精力和斗志用在球场,该多好!世界杯还会出不了线吗??一波未平一波又起,中国足球圈又爆丑闻!近日,疑似上海海恩比德伤病出炉里弗斯变脸,爵士悍将拒绝提前续约,美媒爆4换2北京时间1月9日,NBA常规赛正在如火如荼进行中,各支球队都在为季后赛席位而厮杀,经过一个月的进程,各支球队可谓几家欢喜几家愁,既有年轻球队逆流而上,也有豪门球队跌下神坛,竞技体育8胜1负,联盟第一!悄悄进入西部前四,总冠军和MVP我全都要这个赛季,常规赛赛程接近一半,从现在的排名来看,是否基本上符合赛季初你的预期?东部这边,局势还是比较明朗,上赛季的东部冠军凯尔特人,依然保持着强劲的统治力,以28胜12负,暂列东部足协开罚单!惩治5队,36人被终身禁赛,还要清算中超欠薪!中国足坛如今已经进入了一个多事之秋,随着国足的前主帅李铁被调查,国内足坛的很多人都是人人自危,生怕自己也步李铁的后尘,成为又一个阶下囚。而作为中国足球的主要管理者,中国足协近日也是20投18中NBA赛事火箭vs森林狼天赋大队相遇,碰出怎样的火花?NBA赛事火箭vs森林狼赛季至今火箭队依然稳稳的排在西部倒数第一的位置,球队在推倒重建后囤积了大量优质新秀,杰伦格林,申京,凯文波特,史密斯等都各自具备特点。现在的火箭就是一块璞玉煤油灯的光亮很微弱,但母亲坚信能照亮我的前程作者蒋周德说起煤油灯,也许今天的孩子们大都不知道是何物。而上了点年纪的老人们,特别是农村人,无不对这每天夜晚曾点亮我们生活的煤油灯,有着很深的感情和刻骨铭心的记忆01hr大地尚未苏越是处于高纬度的人,越相信人性是恶的人性善恶论,争论了几千年。然后,你会发现,越是相信善的人,越容易往下走。而那些能直面人性恶的人,却往往是往上走的。这看起来是一个有悖于常态的逻辑,但实际上,你往里面细究,就会发现,土超助攻榜伊斯坦布尔VS代米尔体育GBSPORTS推荐伊斯坦布尔成立于1990年,目前参加土耳其超级联赛。2007年至2014年,伊斯坦布尔队在阿塔图尔克奥林匹克体育场比赛。2014年,BasaksarFatihT
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网