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

深挖面向对象编程三大特性封装继承多态

  大家好,我是呼噜噜,今天我们来深挖面向对象编程三大特性:封装、继承、多态封装
  把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。
  通俗的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。但是如果个类没有提供给外界访问的法,那么这个类也没有什么意义了。
  我们来看一个常见的类,比如:StudentpublicclassStudentimplementsSerializable{privateLongid;privateStringname;publicLonggetId(){returnid;}publicvoidsetId(Longid){this。idid;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}}
  将对象中的成员变量进行私有化,外部程序是无法访问的。对外提供了访问的方式,就是set和get方法。而对于这样一个实体对象,外部程序只有赋值和获取值的权限,是无法对内部进行修改继承
  继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。在Java中通过extends关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:class父类{}class子类extends父类{}
  继承概念的实现方式有二类:实现继承与接口继承。
  实现继承是指直接使用基类的属性和方法而无需额外编码的能力接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力一般我们继承基本类和抽象类用extends关键字,实现接口类的继承用implements关键字。
  注意点:
  通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过继承(Inheritance)和组合(Composition)来实现。子类可以拥有父类的属性和方法。子类可以拥有自己的属性和方法,即类可以对类进扩展。子类可以重写覆盖父类的方法。JAVA只支持单继承,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。
  使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。implements关键字publicinterfaceA{publicvoideat();publicvoidsleep();}publicinterfaceB{publicvoidshow();}publicclassCimplementsA,B{}
  值得留意的是:关于父类私有属性和私有方法的继承的讨论这个网上有大量的争论,我这边以Java官方文档为准:Withtheuseoftheextendskeyword,thesubclasseswillbeabletoinheritallthepropertiesofthesuperclassexceptfortheprivatepropertiesofthesuperclass。子类不能继承父类的私有属性(事实),但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
  官方文档明确说明:private和final不被继承,但从内存的角度看的话:父类private属性是会存在于子类对象中的。
  通过继承的方法(比如,public方法)可以访问到父类的private属性
  如果子类中存在与父类private方法签名相同的方法,其实相当于覆盖
  个人觉得文章里的一句话很赞,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。多态
  同一个行为具有多个不同表现形式或形态的能力就是多态。网上的争论很多,笔者个人认同网上的这个观点:重载也是多态的一种表现,不过多态主要指运行时多态Java多态可以分为重载式多态和重写式多态:
  重载式多态,也叫编译时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。也就是说这种多态再编译时已经确定好了。重写式多态,也叫运行时多态。运行时多态是动态的,主要指继承父类和实现接口时,可使用父类引用指向子类对象实现。这个就是大家通常所说的多态性。这种多态通过动态绑定(dynamicbinding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。这种多态可通过函数的重写以及向上转型来实现。
  多态存在的三个必要条件:继承
  重写
  父类引用指向子类对象:ParentpnewChild();
  我们一起来看个例子,仔细品读代码,就明白了:SpringBootTestclassDemo2021ApplicationTests{classAnimal{publicvoideat(){System。out。println(动物吃饭!);}publicvoidwork(){System。out。println(动物可以帮助人类干活!);}}classCatextendsAnimal{publicvoideat(){System。out。println(吃鱼);}publicvoidsleep(){System。out。println(猫会睡懒觉);}}classDogextendsAnimal{publicvoideat(){System。out。println(吃骨头);}}TestvoidcontextLoads(){part1CatcatnewCat();cat。eat();cat。sleep();cat。work();part2AnimalcatnewCat();cat。eat();cat。work();cat。sleep();此处编译会报错。AnimaldognewDog();dog。eat();结果为:吃骨头。此处调用子类的同名方法。part3如果想要调用父类中没有的方法,则要向下转型,这个非常像强转Catcat222(Cat)cat;向下转型(注意,如果是(Cat)dog则会报错)cat222。sleep();结果为:猫会睡懒觉。可以调用Cat的sleep()}}
  我们来看上面part1部分:CatcatnewCat();cat。eat();cat。sleep();cat。work();
  结果:
  吃鱼猫会睡懒觉。动物可以帮助人类干活!
  cat。work();这处继承了父类Animal的方法,还是很好理解的我们接着看part2:AnimalcatnewCat();cat。eat();cat。work();cat。sleep();此处编译会报错。AnimaldognewDog();dog。eat();结果为:吃骨头。此处调用子类的同名方法。
  这块就比较特殊了,我们一句句来看AnimalcatnewCat();像这种这个父类引用指向子类对象,这种现象叫做:向上转型,也被称为多态的引用。cat。sleep();这句编译器会提示编译报错。表明:当我们当子类的对象作为父类的引用使用时,只能访问子类中和父类中都有的方法,而无法去访问子类中特有的方法值得注意的是:向上转型是安全的。但是缺点是:一旦向上转型,子类会丢失的子类的扩展方法,其实就是子类中原本特有的方法就不能再被调用了。所以cat。sleep()这句会编译报错。
  cat。eat();这句的结果打印:吃鱼。程序这块调用我们Cat定义的方法。cat。work();这句的结果打印:动物可以帮助人类干活!我们上面Cat类没有定义work方法,但是却使用了父类的方法,这是不是很神奇。其实此处调的是父类的同名方法AnimaldognewDog();dog。eat();这句的结果打印为:吃骨头。此处调用子类的同名方法。由此我们可以知道当发生向上转型,去调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。如果子类没有同名方法,会再次去调父类中的该方法
  我们现在知道了向上转型时会丢失子类的扩展方法,哎,但我们就是想找回来,这可咋办?向下转型可以帮助我们,找回曾经失去的
  我们来看part3:Catcatreal(Cat)cat;注意此处的cat对应上面父类Animal,可不是子类catreal。sleep();
  Catcat(Cat)cat;cat222。sleep();这个向下转型非常像强转。打印的结果:猫会睡懒觉。此处又能调用了子类Cat的sleep()方法了。一道简单的面试题
  我们再来看一道有意思的题,来强化理解publicclassMain{staticclassAnimal{intweight10;publicvoidprint(){System。out。println(thisAnimalPrint:weight);}publicAnimal(){print();}}staticclassDogextendsAnimal{intweight20;Overridepublicvoidprint(){System。out。println(thisDogPrint:weight);}publicDog(){print();}}publicstaticvoidmain(String〔〕args){DogdognewDog();System。out。println();Animaldog222newDog();Dogdog333(Dog)dog222;System。out。println();Dogdog444(Dog)newAnimal();}}
  执行结果:
  thisDogPrint:0thisDogPrint:20
  thisDogPrint:0thisDogPrint:20
  thisAnimalPrint:10Exceptioninthreadmainjava。lang。ClassCastException:com。zj。MainAnimalcannotbecasttocom。zj。MainDogatcom。zj。Main。main(Main。java:15)
  做对了嘛,不对的话,复制代码去idea中debug看看
  我们先看第一部分DogdognewDog();程序内部的执行顺序:先初始化父类Animal的属性intweight10
  然后调用父类Animal的构造方法,执行print()
  实际调用子类Dog的print()方法,打印:thisDogPrint:0,由于此时的子类属性weight并未初始化
  初始化子类Dog的属性intweight20
  调用子类Dog的构造方法,执行print()
  实际调用当前类的print()方法,打印thisDogPrint:20
  其中有几处我们需要注意一下:实例化子类dog,程序会去默认优先实例化父类,即子类实例化时会隐式传递Dog的this调用父类构造器进行初始化工作,这个和JVM的双亲委派机制有关,这里就不展开讲了,先挖个坑,以后再来填。当程序调用父类Animal的构造方法时,会隐式传递Dog的this,类似于:DogdognewDog(this);staticclassAnimal{publicAnimal(this){print(this);子类又把print()给重写了}}staticclassDogextendsAnimal{publicDog(this){print(this);此时子类的属intweight被没有初始化默认为0}}
  这块其实和JVM的虚方法表有关,这又是一个大坑,以后慢慢填。我们接着看第2部分Animaldog222newDog();这句是向上转型,程序加载顺序和第一部分DogdognewDog();是一样的,都是实例化类的过程Dogdog333(Dog)dog222;这个是向下转型,并没有调用类构造器,这块等会和第3部分结合讲
  最后我们来看下第3部分Dogdog444(Dog)newAnimal();这句先实例化Andimal类,它没有父类,就直接实例化当前类,打印thisAnimalPrint:10。然后(Dog)表示向下转型,但是为啥运行会报ClassCastException异常呢?且第2部分Dogdog333(Dog)dog222;却没有问题?我们可以发现,向下转型可以让子类找回其独有的方法但是向下转型是不安全的,实现向下转型前需要先实现向上转型。
  本篇文章到这里就结束啦,很感谢你能看到最后,如果觉得文章对你有帮助,别忘记关注我!
  计算机内功、JAVA源码、职业成长、项目实战、面试相关资料等更多精彩文章在公众号小牛呼噜噜

科莫多巨蜥的毒液到底有多可怕?2009年,一名31岁的渔民安瓦尔,在印尼科莫多岛上采摘水果,结果不小心从水果树上掉了下来,刚好踩到了一只巨型蜥蜴,蜥蜴瞬间就朝他扑了过去,咬住了他的腿,之后又咬住了他的手臂,身体武汉未来的房价会涨到100000元平米吗?这个问题的答案是肯定的!以目前的趋势,未来武汉房价必然达到10万的水平,只是时间长短的问题。2010年至2017年,短短七年间,武汉的房价已经翻了3番,目前,武汉部分高端楼盘如洞庭兰州青白石片区,中央公园怎么样?兰州北拓的黄金区域,目前基础交通还跟不上建设需要,交通滞后可能会成为十四五期间兰州青白石片区发展的的最大障碍!不过就兰州地理位置和城区格局而言,青白石片区是离主城区最近的待开发区域农民为什么不在国家统计失业范围之内?中国有四个儿子,大儿子叫工人,二儿子叫子弟兵,三儿子叫公务员,四儿子叫农民,所以四儿子就没有纳入统计失业包括养老金范围,因为四儿子有金山银山还有三分地。农民有土地,这是农民可以赖以农村成立社区是什么意思?很多农村驻有村委会办公室,同时也驻有社区管理委员会办公室,特别是在城市郊区的农村和街道的农村都同时设立了村委会和社区管理委员会,很多人弄不明白是怎么回事。那农村成立社区是什么意思呢农村里的剩男,为何一剩再剩呢?到底是什么原因?男女比例失调。计划生育只要一个孩子时,受封建思想影响,都拚命要男孩,等他们长大了,很难找到媳妇。一,农村姑娘远嫁,二,女孩见少,三,彩礼高,四,剩男挣钱少。我就一大龄剩男!个人亲身抖音付费直播试水,看直播要给钱了?我们应该如何思考?使劲收,最好是家人们看的话,一分钟100块钱。毕竟粉丝听话的很。毕竟人设都设计好了打PK,卖货摆错价格,怒亏2个亿回馈粉丝。没事就怼工厂,怼员工反正就是赔钱回馈粉丝。赔完还得补交税马上就要退休了,退休工资才3650元太少了,怎么办?3600不少了。我企业工龄32年,退休时退休金只有2200,涨了这么多年还不到3000。知足常乐吧!如果身体不好,这些钱也够生活了,如果身体还可以,就找一些力所能及的工作,打打工补南宁五象新区未来的发展潜力很大吗?五象新区无法成为国家级新区!!!目前看来,五象新区的潜力也就这样了。我们对比一下贵阳的贵安新区,贵安新区的面积是1700平方公里,由贵阳市的郊区和安顺市合并得来。是全国第8个国家级如果把三峡大坝加高10米,截留更多的洪水,可行吗?我国的三峡大坝,作为当今世界上最大的水利枢纽工程,位于湖北省宜昌市上游,距下游葛洲坝水电站38公里,三峡大坝全长2309米高185米,呈梯形形状,集发电旅游航运调控洪水于一身。三峡大家有经历过亲人去世吗?是怎样走出痛苦和想念的?2018年9月1日下午3点8分,我的妻子在医院里停止了呼吸。她的眼睛没有闭上,我流着泪,帮她合上了双眼。我永远失去了我最亲近的爱人,孩子永远的失去了妈妈。一位好妻子,好女儿,好姑妈
郭艾伦16分14板,辽篮开门红!对抗强度大,裁判的吹罚被杨毅吐槽CBA常规赛,上赛季的冠军vs亚军,辽宁男篮vs浙江东阳光!本以为是一场从开始就强强对抗的比赛,结果没想到浙江东阳光第一节被辽宁队打懵了,准确来说是被弗格打爆了。这一节东阳光队只得CCTV5直播!李春江抢首胜,王哲林VS新疆高塔,齐麟挑战丁彦雨航10月11日是CBA常规赛第一轮第二个比赛日,官方安排了5场比赛,除了广东对北控可能会被取消外,其他场次竞争会比较激烈,每支新亮相的球队都想拿到赛季第一场胜利。晚上1935分的上海三大特殊优势,让它成为了顶级旗舰机型的共性不久前,我们三易生活曾分析了谷歌方面刚刚发布的Pixel7系列机型。当时我们指出,由于Pixel7系列的用料硬件配置非常将就,这使得它对于消费者来说显得诚意不足。而落后的处理器架构这条悬空长吊桥,你敢挑战一下吗?这条悬空长吊桥,你敢挑战一下吗?01hr关于卡尼略Tibetan桥今年春天,位于安道尔卡尼略的Tibetan桥在历经18个月的建造后正式揭幕。这座耗资460万欧元的长吊桥,成为了比迪拜或将建巨型月球形建筑,在地登月可能成真?太空旅行不仅仅是亿万富翁们的游戏,对于无法支付高达几十万美元的太空飞船票价的普通人来说,去一次太空中心参观航天发射场,或是去太空博物馆,都是太空旅行的一部分,未来,这张名单上可能再人体的胃像一台混泥土搅拌筒人的一生要吃进多少食物,谁都说不清楚。我现在的饮食是什么?去看我前面发表的巜旅游是当代最被追捧和千方百计去实现的个人追求。在那里,我阐述了我现在的生活和饮食。过去吃过的山珍海味只是说说咱大兰州喜迎二十大兰州处在中国的大西北,是中国版图的地理中心。兰州占地一万三千平方公里,常住人口有四百多万,是中国西部的重要中心城市。母亲黄河兰州是中国唯一的黄河带着远古文明穿城而过的城市,它是甘肃梁山县开展喜迎二十大普法基层行送法进景区活动近日,梁山县司法局联合县市场监督管理局深入县大路口乡贾堌堆景区开展喜迎二十大普法基层行送法进景区活动。活动中,县市场监督管理局工作人员向来往游客宣讲了疫情防控的相关规定,引导游客要外商独资旅行社出境游试点扩大,是狼来了?出境游的春天来了?政策文件关于10。8日发布的104号函一出,旅游行业又来了一波认为这是开放出境游的信号,还有部分人认为外资旅行社可经营出境业务是惠民,出境游团费更便宜了。我觉得完全想多了。只是加入北海道SOS未解悬案,其中疑点重重,遗物中为何传出诡异语音探索世界未知之谜,寻找离奇诡异事件。大家好,我是诡奇先生。今天我要聊的是我在寻找素材时发现的一则比较诡异的雪山SOS事件,其实这个事件早在几年前就已经报道过了,今天特意找出这一事件秋天,爬山去!马鞍山这10座绝美山峰,少走一处都是遗憾花落花开,又到了最适合登山的时节!每每到了秋天,最让小编开心的,莫过于挑选一个阳光灿烂的日子,叫上亲朋好友一起,徒步爬山登高远望。登山,不仅可以贻神健身,还能呼吸到绝佳的清新空气,
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网