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

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

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

曾繁日刘权标赛季报销,广东队能从保险公司获得多少赔偿?2122赛季,因为轮转人员不足的问题,广东男篮自乱阵脚打乱了自己的部署,特别是在第一阶段,为了省钱,只是让威姆斯一个人支撑,这也最终让伤病发生的次数越来越多,最终广东男篮也是被拖垮DNF腾讯市值蒸发5万亿,版号凛冬这次的河蟹事件可以百分百肯定就是为了DNF手游上线铺路,因为腾讯现在国内基本拿不到新游戏的版号,就手里的仨瓜俩枣已经捉襟见肘,有版号的就尽可能的包装上线回血,前段时间的黑沙手游同理俄罗斯外长美国的目的是削弱欧盟乌克兰危机升级以来,欧洲与美国一道对俄罗斯施加多轮制裁,但制裁的反噬效应令不少高度依赖俄罗斯能源的欧洲国家深陷危机。俄罗斯外长拉夫罗夫近日在访问中表示,美国的目的是在军事和经济上削0。63,中签率重新走低!新股密集发行,这些公司曾下调发行底价点蓝字关注,不迷路来源北证资讯逾9万户参与打新,北交所新股中签率重新走低。慧为智能这次网上发行获配比例为0。63,低于此前的新股中科美菱夜光明天纺标。近期新股密集发行,随着10月3马代游记马儿真的累了马尔代夫银滩落叶度假休闲不外乎两类一是龟式,即鲁迅所说躲进小楼成一统,管他春夏与秋冬二是忍者神龟式,所谓野蛮其体魄,文明其精神。年底休假,策划一次马尔代夫放飞。雪前的郑州小城一派阴担忧经济衰退美多家科技公司决定裁员出于对通胀加剧和经济衰退的担忧,美国多家科技公司近日决定裁员或停止招聘。当地时间3日,美国一家主要线上支付公司宣布,为应对不断加剧的通胀更高的利率以及能源危机等,该公司将不得不裁员达州市的区划调整,四川省的第7大城市,为何有7个区县?在之前的文章中,作者和大家聊了一系列关于我国四川省各个城市经济发展和区划变迁的故事,例如成都市绵阳市德阳市。今天,我们聊聊四川省的达州市。达州市是四川省的资源重镇工业重镇,目前,合江西饮酒怪象,嘴上都说四特酒好,但常喝的却是这3款纯粮酿在网上,有人给江西省起了个绰号,叫阿卡林省,形容它在全国各省份里,存在感很低,大家讨论的也不多。细想一下的确如此,江西省位于我国南方,虽然风景秀丽,人文氛围浓厚,可比起它的邻居们广万众期待!永丰县丰乐谷明天开园!丰乐谷5号开园啦世界有不绝的风景我有不老的心向喜欢的季节靠近一切都微妙而美好和自己爱的人来丰乐谷感受秋天的快乐全面消杀景区已按照相关部门要求进行了多次的全面消杀工作,并健全了防疫工台州三门万亩养殖塘美如画来源人民网浙江频道人民网台州11月3日电(孙鹏)日前,空中俯瞰台州市三门县万亩养殖塘,美景如画。素有中国青蟹之乡中国小海鲜之乡之称的三门,有着59万亩浅海21万亩滩涂和19万亩海水荷兰开放到什么程度?露天做此事已经见怪不怪,而且是合法的越来越多人选择外出旅游这一项娱乐活动,尤其是很多有一定经济条件的人也会选择去国外游玩,因为国外有各种特别的风景,以及独特的民俗风情,甚至当地的文化对于其他国家的人来说都是相当有吸引
3月新机扎堆发布,业内人士着重关注这几款,优点缺点给你理清楚随着近期新机集中发布,不少网友也是开始坐不住了,打算给自己入手一款新机。可以发现今年各大手机厂商推出的新品,相比较于去年而言,综合实力可谓是全方位的提升。像是更多手机用上了潜望镜的比特币价格会重回2万美元吗?BTC入门级的详细交易计划在加密货币市场的持续复苏中,比特币价格出现了直立的反弹,并突破了长达两个月的看涨模式的阻力趋势线,该模式被称为巨浪。这一突破应该会加速市场上的购买压力,并为买家提供支持,使价格进一iQOOZ7详细参数汇总,就等价格了!结合Z6的首发价以及现在Neo7SE官方价格,预测Z7的8128版本将会定价1699Z6iQOOZ7在性能方面继续挤牙膏,搭载骁龙782G处理器LPDDR5ufs3。1,不过其他方海南三亚一导游因游客未购物大骂游客官方涉事导游将依法依规处理2023年3月17日上午,网传三亚一导游疑因游客未购物大骂游客的视频引发媒体和网民关注,视频中导游站在大巴车前方大叫我带团这么久,从来没碰到过这样的客人,你可以不听,你可以下车,我阿尔卡拉兹2比0横扫梅德韦德夫,力压德约重返世界第一,创造纪录文搏击江湖北京时间3月20日上午,ATP1000等级的美国印第安维尔斯大师赛男单决赛激情落幕,赛会头号种子西班牙小将卡洛斯阿尔卡拉兹状态火热,以6362横扫俄罗斯的美总丹尼尔梅德维布朗将在休赛期离开绿军另觅良队?双方就合同续约事宜存在分歧昨日波士顿凯尔特人做客犹他客场挑战爵士,似乎一场实力悬殊的比赛。毕竟两队战绩排名悬殊,尽管分属东西部。比赛进程似乎也在按照人们预期进行,第二节绿军一度领先爵士19分。主场作战的爵士人工智能时代,我们应该如何面对我今天这篇文章,就是我一边和chatgpt对话寻找灵感,一边思考而来的。当然我也让chatgpt帮我写了一些大纲和部分内容。我想我以后的文章都会让人工智能作为我的助手,我甚至给我所红狮集团的新能源野心拟收购亚洲硅业控制权构建双主业格局本报记者张英英吴可仲北京报道由光伏教父施正荣夫妇实际控制的亚洲硅业(青海)股份有限公司(以下简称亚洲硅业)或将易主。2月28日,上海市市场监督管理局官网对红狮控股集团有限公司收购亚意甲最大夺冠分差国米22分第一,本赛季那不勒斯可能打破!直播吧3月20日讯意甲第27轮,那不勒斯客场40完胜都灵,国米主场01不敌尤文,拉齐奥则主场10战胜罗马。本轮战罢,那不勒斯积71分一骑绝尘,领先第二的拉齐奥19分。本赛季那不勒斯年均增长50以上!广东将推动新型储能产业上万亿规模到2025年全省新型储能产业营业收入达6000亿元,年均增长50以上,到2027年实现营收达1万亿元。3月20日,广东省人民政府网站发布广东省推动新型储能产业高质量发展的指导意见(北向资金昨日净买入16。02亿元,中天科技宁德时代等获加仓(名单)昨日(3月20日)A股收盘,沪指跌0。48,深成指跌0。27,创业板指跌0。08。总体上个股跌多涨少,两市超3000只个股下跌。沪深两市昨日成交额10575亿,较上个交易日放量84