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

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

  大家好,我是呼噜噜,今天我们来深挖面向对象编程三大特性:封装、继承、多态封装
  把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。
  通俗的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。 通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。但是如果 个类没有提供给外界访问的 法,那么这个类也没有什么意义了。
  我们来看一个常见的 类,比如: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源码、职业成长、项目实战、面试相关资料等更多精彩文章在公众号「 小牛呼噜噜 」

向太晒孙女近照,小奶皇扎辫子戴墨镜,像极了向太,拽姐范十足近日,向太陈岚在社交平台上晒出了孙女小奶皇的照片,这是向太首次公开孩子的长相,瞬间引来了不少网友的关注。从照片中可以看出,这个快一岁的萌娃长高不少,头上扎着两个羊角辫,穿着奶牛衬衫60岁郎平定居美国!在纽约晒与谷爱凌合影,状态超好笑容满面郎平全家罕见露面2021年9月1日,伟大的女排教练郎平,在女排比赛失利之后,正式宣布卸任中国女排主教练。卸任之后,郎平就前往了美国纽约定居,一直生活在纽约。有网友偶尔还能够遇到郎平不敌凯尔特人创耻辱纪录,热火系列赛大势已去?在热火对阵凯尔特人的系列赛的第四场比赛中,热火巴特勒和凯尔特人罗伯特威廉姆斯都带伤出战,然而首节热火便陷入被动,首发全员皆无状态开局甚至一度被凯尔特人打了181的攻击波,首节结束凯这是怎么了?台球女神裁判凌晨发文成年人了总瞎立什么flag呢?在中国台球圈,有不少让人印象深刻的球员,比如九球天后潘晓婷丁俊晖等,而说到台球裁判,你又会想起了谁呢?相信不少球迷对于一个并不陌生王钟瑶。北京时间3月22日凌晨4点左右,王钟瑶发布31岁刘诗雯再出发,打破退役传闻新岗位曝光,刘国梁没看错人用行动打破退役传闻,国乒一姐新岗位曝光,依然会是刘国梁的首选刘诗雯已经走到职业生涯的十字路口!目前中国乒乓球队整体已经来到了山东威海训练。由于亚运会延期,国乒未来的备战重点将会是9国际乒联背锅了!18岁申裕斌又骨折了,因改器材韩乒练废天才少女近日,韩国乒乓球队传来了让人很心痛的消息,18岁的小将申裕斌再次应力性骨折如今乒乓球的技术越来越倾向于力量与速度,看来18岁的申裕斌未来的职业生涯不好走了,因为应力性骨折非常容易反中超84岁功勋老板哭了紧急返回重庆队,不知情不满欠薪新希望聚焦中超CBA,独一无二球迷媒体点击右上角关注,不会后悔的重庆两江退出中国职业足坛后,有关俱乐部的后续成为了球迷主要焦点。应该说,解散的结局已经无法逆转,接下来更多的还是善后,而这亚洲杯或重回中国?亚足联骑虎难下,日韩坐地起价需要资金支持自从2023亚洲杯宣布不在国内举办,新的举办地一直悬而未决。中国足协为了这次亚洲杯,其实做了不少努力,有多达10个城市参与其中,还耗资修缮场馆等。可由于亚足联对于闭环举办的不认同,43岁因英雄无悔成名,弟弟父亲接连去世,濮存晰竟然这样做说起德艺双馨,娱乐圈里能配得上这四个字的演员少之又少,可濮存晰绝对是其中一员。可能很多人觉得这个名字不太熟悉,可要说起20多年前的那部英雄无悔,相信好多人都很熟悉,濮存晰饰演光明磊中国女排国手访谈预告出炉!吴梦洁胳膊肌肉最吸眼球,盈莹沉稳我在头条搞创作2020年国家联赛即将开赛,最近网上流传一段国手访谈预告片吸引了大批球星的追捧和热议。出镜的队员个个阳光明媚,信心满满,她们经历了漫长的煎熬,刻苦的训练,正在摩拳擦掌中国足球粉碎机?陈戌源上任4年,中超3支球队解散,史无前例陈戌源在2018年担任中国足球协会主席,在他上任的这4年期间,中国足球也发生了翻天覆地的变化。前10年的金元足球被一下子推翻,打消足球泡沫回归正常发展。但是就是陈戌源口中的正常发展
旅游是富人的专属吗?穷人应不应该走出去看看?旅游带给你最大的好处是什么我个人建议,不管你有没有钱都应该走出去看一看,看一下沿途的风景,感受一下当地的人情。我认为越是在我们没有钱时,对前途迷茫时,越要走出去,不要在自己熟悉的环传北京环球度假区日流量不足千人,游客花车巡游只有4个观众,热门项目连玩3遍近日,一张截图在社交媒体广泛流传,截图消息称,11月29日,北京环球度假区的入园人数只有900人11月30日入园人数则创历史新低,只有850人。九派新闻记者联系了消息的发布者环球小香港的僵尸电影,一个时代的兴起与衰落香港电影最为突出的贡献之一就是僵尸电影。在此之前,恐怖电影电视中基本都是以鬼怪为主,直到林正英创作后,僵尸电影成为了一种电影类型。僵尸电影的形象也基本都是林正英在那个时候创作出来的我们常说的智能家居优势是什么(一)智能家居已经渐渐的成为很多家庭中都存在的,现在智能化的产品渐渐的都出现在了生活中,那智能家居有哪些优势?下面就一起来看看。1强人居环境的安全性在令人类居住环境更加舒适的同时,安全也论手机的内卷能力随着智能科技升级,其它行业转型的时间不多了论手机的内卷能力,还得从手机都干掉了啥开始?无须我们质疑,随着智能科技逐渐升级,留给被卷群体转型的机会正倒计时中!随着智能手机的普及,一大批的电子产品统统被手机拿下了,当然,也可以智能小怪兽无界Pro,打造20万元级智能车体验11月3日11月10日,怪兽来袭战力全开智能小怪兽奇瑞QQ无界Pro(图片)全国媒体体验会完美收官!八天时间,近200位核心媒体跨界大咖,通过场地体验道路试驾自由试驾等环节对智能小因为这个黑洞,霍金打赌输了一年的情色杂志,黑洞到底是什么?黑洞是现代广义相对论中存在于宇宙空间中的一种天体。它的时空展现出引力的加速度极端强大,以至于使得视界内的逃逸速度大于光速!是一个任何粒子或电磁辐射都无法逃离的区域。但是最早科学家发促销季已收官?不要慌!请看这里今年的促销季刚刚结束,关注显示器产品的小伙伴们,一定已经注意到S标准,因为S标准在多款产品的主页面上都已露出。没错,今年的促销季,S标准崭露头角,在京东多个主要位置多窗口进行宣传,极目锐评台州发生交通事故致2死1伤,特斯拉,怎么又是你?极目新闻评论员吴双建11月28日,浙江台州路桥区发生一起碰撞事故,一辆特斯拉与两车相撞,造成三辆汽车受损严重,两人死亡一人受伤。(据11月29日极目新闻)据目击者称,当时特斯拉车速铭说一种名为RedlineStealer的密码窃取程序01序言RedlineStealer是一个运行于MaaS(恶意软件即服务)模式的信息窃取程序。该恶意软件由C编写而成,且在地下论坛根据功能的不同以不同的价格出售。研究人员在wind产业地图系列石墨烯产业研究报告导读本文首先介绍了什么是石墨烯和其特性,进而对石墨烯的应用领域制备技术专利产业链市场进行分析,最后盘点了全球主要制备企业发展趋势和潜在应用场景。目录什么是石墨烯石墨烯的特性主要国家