范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  大家好,我是呼噜噜,今天我们来深挖面向对象编程三大特性:封装、继承、多态封装
  把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。
  通俗的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。 通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。但是如果 个类没有提供给外界访问的 法,那么这个类也没有什么意义了。
  我们来看一个常见的 类,比如:Student public class Student implements Serializable {          private Long id;     private String name;      public Long getId() {         return id;     }      public void setId(Long id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }  }
  将对象中的成员变量进行私有化,外部程序是无法访问的。对外提供了访问的方式,就是set和get方法。 而对于这样一个实体对象,外部程序只有赋值和获取值的权限,是无法对内部进行修改 继承
  继承  就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: class 父类 { }   class 子类 extends 父类 { }
  继承概念的实现方式有二类: 实现继承 与 接口继承 。
  实现继承是指直接使用基类的属性和方法而无需额外编码的能力 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力 一般我们继承基本类和抽象类用 extends 关键字,实现接口类的继承用 implements 关键字。
  注意点:
  通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"、"父类"或"超类"。 继承的过程,就是从一般到特殊的过程。要实现继承,可以通过"继承"(Inheritance)和"组合"(Composition)来实现。 子类可以拥有父类的属性和方法。 子类可以拥有自己的属性和方法, 即 类可以对 类进 扩展。 子类可以重写覆盖父类的方法。  JAVA 只支持单继承 ,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。
  使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。 # implements 关键字  public interface A {     public void eat();     public void sleep(); }   public interface B {     public void show(); }   public class C implements A,B { }
  值得留意的是: 关于 父类私有属性和私有方法的继承  的讨论 这个网上 有大量的争论,我这边以Java官方文档为准: With the use of the extends keyword, the subclasses will be able to inherit all the properties of the superclass except for the private properties of the superclass. 子类 不能继承 父类的 私有属性 (事实),但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类 使用 的。
  官方文档 明确说明: private和final不被继承,但从内存的角度看的话:父类private属性是会存在于子类对象中的。
  通过继承的方法(比如,public方法)可以访问到父类的private属性
  如果子类中存在与父类private方法签名相同的方法,其实相当于覆盖
  个人觉得文章里的一句话很赞,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。 多态
  同一个行为具有多个不同表现形式或形态的能力就是 多态 。网上的争论很多,笔者个人认同网上的这个观点:重载也是多态的一种表现,不过多态主要指运行时多态 Java 多态可以分为  重载式多态 和 重写式多态 :
  -重载式多态,也叫编译时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。也就是说这种多态再编译时已经确定好了。 -重写式多态,也叫运行时多态。运行时多态是动态的,主要指 继承 父类和实现接口时,可使用父类引用指向子类对象实现。 这个就是大家通常所说的多态性 。 这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态可通过函数的重写以及向上转型来实现。
  多态存在的三个必要条件: 继承
  重写
  父类引用指向子类对象:Parent p = new Child();
  我们一起来看个例子,仔细品读代码,就明白了: @SpringBootTest class Demo2021ApplicationTests {      class Animal {         public void eat(){             System.out.println("动物吃饭!");         }         public void work(){             System.out.println("动物可以帮助人类干活!");         }     }      class Cat extends Animal {         public void eat() {             System.out.println("吃鱼");         }         public void sleep() {             System.out.println("猫会睡懒觉");         }     }      class Dog extends Animal {         public void eat() {             System.out.println("吃骨头");         }     }      @Test     void contextLoads() {         //part1         Cat cat_ = new Cat();         cat_.eat();         cat_.sleep();         cat_.work();          //part2         Animal cat=new Cat();         cat.eat();         cat.work();         cat.sleep();//此处编译会报错。          Animal dog=new Dog();         dog.eat();//结果为:吃骨头。此处调用子类的同名方法。                  //part3         //如果想要调用父类中没有的方法,则要向下转型,这个非常像"强转"         Cat cat222 = (Cat)cat;        // 向下转型(注意,如果是(Cat)dog 则会报错)         cat222.sleep();        //结果为:猫会睡懒觉。 可以调用 Cat 的 sleep()     }    }
  我们来看上面part1部分: Cat cat_ = new Cat(); cat_.eat(); cat_.sleep(); cat_.work();
  结果:
  吃鱼 猫会睡懒觉。 动物可以帮助人类干活!
  cat_.work();这处继承了父类Animal的方法,还是很好理解的 我们接着看part2: Animal cat=new Cat(); cat.eat(); cat.work(); cat.sleep();//此处编译会报错。  Animal dog=new Dog(); dog.eat();//结果为:吃骨头。此处调用子类的同名方法。
  这块就比较特殊了,我们一句句来看 Animal cat=new Cat(); 像这种这个 父类引用指向子类对象,这种现象叫做: "向上转型" ,也被称为 多态的引用 。 cat.sleep();这句 编译器会提示 编译报错。 表明:当我们当子类的对象作为父类的引用使用时,只能访问子类中和父类中都有的方法,而无法去访问子类中特有的方法 值得注意的是: 向上转型 是安全的。但是缺点是:一旦向上转型,子类会 丢失 的子类的扩展方法,其实就是 子类中原本 特有 的方法就不能再被调用了。所以cat.sleep()这句会编译报错。
  cat.eat();这句的结果打印:吃鱼。程序这块调用我们Cat定义的方法。 cat.work();这句的结果打印:动物可以帮助人类干活! 我们上面Cat类没有定义work方法,但是却使用了父类的方法,这是不是很神奇。 其实此处调的是父类的同名方法  Animal dog=new Dog();dog.eat();这句的结果打印为:吃骨头。此处调用子类的同名方法。 由此我们可以知道 当发生向上转型,去调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。如果子类没有同名方法,会再次去调父类中的该方法
  我们现在知道了 向上转型时会丢失子类的扩展方法,哎,但我们就是想找回来,这可咋办? 向下转型可以帮助我们,找回曾经失去的
  我们来看part3:     Cat cat_real = (Cat)cat;  //注意 此处的cat 对应上面父类Animal,可不是子类     cat_real.sleep();
  Cat cat = (Cat)cat; cat222.sleep();这个向下转型非常像"强转"。 打印的结果:猫会睡懒觉。此处又能调用了 子类Cat 的 sleep()方法了。 一道简单的面试题
  我们再来看一道有意思的题,来强化理解 public class Main {          static class Animal{         int weight = 10;          public void print() {             System.out.println("this Animal Print:" + weight);         }          public Animal() {             print();         }     }      static class Dog extends Animal {         int weight = 20;          @Override         public void print() {             System.out.println("this Dog Print:" + weight);         }          public Dog() {             print();         }     }      public static void main(String[] args) {         Dog dog = new Dog();          System.out.println("---------------");         Animal dog222 = new Dog();         Dog dog333 =  (Dog)dog222;                  System.out.println("---------------");         Dog dog444 = (Dog)new Animal();      } }
  执行结果:
  this Dog Print:0 this Dog Print:20
  this Dog Print:0 this Dog Print:20
  this Animal Print:10 Exception in thread "main" java.lang.ClassCastException: com.zj.Main$Animal cannot be cast to com.zj.Main$Dog at com.zj.Main.main(Main.java:15)
  做对了嘛,不对的话,复制代码去idea中debug看看
  我们先看第一部分 Dog dog = new Dog(); 程序内部的执行顺序: 先 初始化 父类Animal 的属性 int weight=10
  然后 调用父类Animal的构造方法,执行print()
  实际调用子类Dog的print()方法,打印:this Dog Print:0,由于此时的子类属性weight 并未初始化
  初始化 子类Dog 的属性 int weight=20
  调用 子类Dog的构造方法,执行print()
  实际调用当前类的print()方法,打印this Dog Print:20
  其中有几处我们需要注意一下:实例化子类dog,程序会去 默认优先 实例化父类,即子类实例化时会隐式传递Dog的this调用父类构造器进行初始化工作,这个和JVM的 双亲委派机制 有关,这里就不展开讲了,先挖个坑,以后再来填。 当程序调用父类Animal的构造方法时,会隐式传递Dog的this,类似于: Dog dog = new Dog(this);  static class Animal{   public Animal(this) {       print(this);//子类又把print()给重写了   } }  static class Dog extends Animal {   public Dog(this) {       print(this);//此时子类的 属int weight 被没有初始化默认为0   } }
  这块其实和JVM的 虚方法表 有关,这又是一个大坑,以后慢慢填。 我们接着看第2部分 Animal dog222 = new Dog();这句是向上转型,程序加载顺序和第一部分Dog dog = new Dog();是一样的,都是实例化类的过程 Dog dog333 = (Dog)dog222;这个是向下转型,并没有调用类构造器,这块等会和第3部分结合讲
  最后我们来看下第3部分Dog dog444 = (Dog)new Animal();这句先实例化Andimal类,它没有父类,就直接实例化当前类,打印this Animal Print:10。然后(Dog)表示向下转型,但是为啥运行会报ClassCastException 异常呢?且第2部分Dog dog333 = (Dog)dog222;却没有问题? 我们可以发现, 向下转型可以让子类找回其独有的方法 但是向下转型是不安全的,实现 向下转型 前需要先实现 向上转型。
  本篇文章到这里就结束啦,很感谢你能看到最后,如果觉得文章对你有帮助,别忘记关注我!
  计算机内功、JAVA源码、职业成长、项目实战、面试相关资料等更多精彩文章在公众号「 小牛呼噜噜 」

武汉三镇各种犯规,马宁置若罔闻!中超遇大面积退赛,还咋玩?中超倒数第二轮的关键战,武汉三镇对阵浙江,武汉三镇各种犯规,铲球,踩踏,而本场主裁马宁竟然没出一张牌,啥意思?就是让武汉三镇爽呗,也享受一下被照顾的感觉!最终武汉三镇20拿下浙江,不批评,不抱怨,不指责是什么,在决定着我们的命运?有一个人,在春天走进一个美丽的公园,出来以后生气地说这地方又脏又臭,我下次再也不来了!而另一个人,也同时走进这个公园,出来后却感叹道简直太美好了!到处都前途无量!落选港姐豪宅内饰曝光,已正式成医生多次被劝别做艺人本文编辑剧透社小彤未经授权严禁转载,发现抄袭者将进行全网投诉有着麦明诗2。0之称的张光怡(Chloe)曾经参选过2022香港小姐竞选,不过可惜的是在竞选中,张光怡没能走到比赛的最后非正式全面解析NebulaGraph中Session管理NebulaGraph论坛最近有些讨论帖,各种姿势来问NebulaGraphSession管理相关的事情,我寻思这也不是一个法子,还是来写一篇文章来讲述下NebulaGraph中的太阳表层长出三个黑斑,像一张笑脸,科学家这是灾难的征兆你相信吗,高挂天边的太阳,竟突然显出了一副笑脸,这本是充满吉祥意味的好兆头,却引得无数科学家大惊失色,甚至还宣称这是灾难的前兆。太阳的微笑众所周知,太阳既是宇宙中的一颗恒星,也是太亚马逊准老板娘太敢穿!健身裤外穿勒出赘肉,被贝索斯牵着太少女亚马逊老板贝索斯和未婚妻桑切斯正在滑雪胜地度假,而当地时间周三,两人牵手出街,在这样冰天雪地的地方,桑切斯的造型也是有了很大的变化,这次要走保暖风格了。贝索斯这身皮毛一体的外套配上章子怡和撒贝宁分手后同台,本是尴尬的事,却被两人高情商化解了撒贝宁和章子怡分手后,一次,在台上相遇了,章子怡大方地调侃到你和之前不一样了,怎么这么不正经了?撒贝宁一脸懵逼,但很快就恢复了自己的高智商,化解了刚才的尴尬,也让全场的人都看呆了。皮蓬詹姆斯是运气最差的竞争对手强总决赛碰到的都是史诗级强队皮蓬认为,詹姆斯职业生涯是非常完美的,但是在运气里面,是最差的,在总决赛中,遇到的对手也是非常强,都是历史级别的强队。乔丹的总决赛对手,不是历史级别的强队。詹姆斯篮球技术虽然是差了家属阳了怎么防护开空气净化器有效么?据江苏公共新闻频道新闻360报道家属如果感染了新冠病毒,有条件的应该单独居住一个房间,同住人要注意做好防护。也有很多人在问,家里的空气净化器加湿器等等,能不能开?有没有防护效果呢?传闻乐高刺猬索尼克主题系列还有五款套装刺猬索尼克主题的乐高套装可能刚刚开了个头,因为基于该主题的乐高套装又有了新的传闻。据海外媒体Promobricks称,在最初的乐高IDEAS系列和LEGODimensions系列短上海蝉联第三!2022全球著名电竞城市发展指数排名出炉电竞大生意第538期,把握每一次电竞商机文刘浏为明确上海电竞产业在全球的排名与定位,上海市文化和旅游局体育局新闻出版局共同指导上海电子竞技运动协会毕马威企业咨询(中国)有限公司,自
自推出24个月以来XSXS全球累计销量突破2000万台今日(12月20日),vgchartz发布了11月27日至12月3日一周的主机预估销量数据以及累计销售数据。据VGChartz估计,当周XboxSeriesXS售出591,167台吹走甲板上的雪花吧!战舰世界扫雪花活动现已开启!战舰世界日已经开始四天了,不知道这几天里这位舰长有没有在本次活动中有所收获呢?本次战舰世界日真箱季主题活动中,战舰世界上线了大量补给箱礼包和诸多作战任务,助力舰长们完成船齐霸业。其都来说一句你心目中无法超越的游戏台词吧,玩家yesindeed!大家好,我是戒戒,专注于分享游戏心得和趣事的戒戒随着科技的飞速发展,现在的人们生活节奏也变得越来越快了,生活节奏的加快也让很多人倍感压力,这时候游戏就成了一个很好的解压工具。游戏引LOL2不敌虎牙主播队MOJ无缘八强北京时间12月20日,2022德玛西亚杯16进4阶段迎来最后一天的比赛,第三场爆出了究极大冷门由bclg(不曾来过)gwrm(过往如梦)baicaiovo(白菜)wzy(王子月)g一位妈妈成长日记,多一些宽容!12月19日本来是一个平平常常的日子,因为我的发烧让很多人都紧张了起来。比如说彤彤。她是她们班级为数不多的没有阳的同学。彤是一个极其细心的孩子,又像一个操心的大家长。她安排我和爸爸点击率爆了!孩子不玩手机也要看,这里竟然藏着大语文的半壁江山文米粒妈阳了几天了,靠着布洛芬续命,又裹着棉被断断续续睡了几天,终于觉得身上轻松一些了。前两天的米粒妈belike我高烧了,不是说好每家留一个做饭的吗?!刚开始全家只有我一人感染,婴儿几天拉屎正常吗?正常情况下,婴儿通常都是以吃为主,而且婴儿的排便情况,也会反映出婴儿的健康情况。因为婴儿的排便情况不好会直接影响到婴儿的身体健康成长。但是,不少人发现婴儿排便次数比较多。那么,婴儿孕妈妈变成小阳人,应该怎么办?近日,吉林长春有一个孕妈妈因为感染了阳性,结果第二天却感觉不到胎动了,到医院后检查,发现是子宫内缺氧严重,遵循医嘱好好休息,到了下午才感受到孩子正常胎动,真是虚惊一场,不过这件事却孩子长不高?二手烟得负责!孩子吸二手烟会影响身高吗?会!孩子是家长抽烟的最大受害者,抽烟有害孩子身体健康,甚至还会导致孩子长不高!接下来迪仔爸爸就给宝爸宝妈们盘一盘抽烟对孩子的危害!抽烟会导致孩子长不高1h宝宝阳了怎么办?父母做好这两件事,要比囤药更重要自从全面解封后,这段时间也是人心惶惶,尤其病毒离我们越来越近,以前只是在手机上看见,不过现在却发生在我们身边。现在就连身边的同事朋友家人邻居,都纷纷传来阳了的消息,有的人体质好点的想做小阴唇整形,该怎么跟妈妈沟通?既然已经出现了摩擦疼痛的情况,作为医生是建议尽快进行手术治疗的。题主主要担心的是如何跟妈妈沟通的问题。作为医生,也经常会遇到父母不同意的情况,可以尝试用下面方法跟妈妈进行沟通。第一