第六章:继承与多态(知识梳理/查漏补缺)

第六章:继承与多态(知识梳理/查漏补缺)

写在前面的废话:
又是一篇卡在ddl上的java博客,可是不得不说这是我最认真的一篇,哪怕它没有像之前的博客那样的满篇代码和运行结果截图,没有大段大段的定义摘抄码字和复制粘贴,没有为了在12点前完成任务和或者为了拿优秀博客而上交一份“漂亮作业”。很打自己的脸来说,这篇博客可以说是娄老师逼我写的,明白老师的苦心,之前的几个周虽然敲了代码完成了博客但等于什么都没学。说句可笑的话,在今晚之前我还不知道public和private具体区别在哪。但也感谢这样一份强制力,让懒散懈怠的我上路,跌跌撞撞前行总比停在原地要更接近收获吧。下面的第六章总结内容可能比较low,毕竟我之前都没学嘛,但都是自己掌握的知识,没有不懂装懂,因为之前都做过代码此处就不演示代码截图了,知识梳理以理论知识为主。另外,今晚实在太晚,第七章的查漏补缺将在下周三晚24:00前推出,接受监督。

第六章知识梳理

6.1何谓继承
  • 1.继承定义:继承基本上就是避免多个类间重复定义共同行为。P158

  • 2.继承的必要性: 举例来说,如果某一数据成员改为其他名称,那么包含这个数据成员的所有类都要进行修改,这就造成了维护上的不便。因此需要把相同的程序代码提升为父类。 P159
  • 3.extends关键字:表示继承行为的关键字。格式为:public class A(子) extends B(父){}。extends关键词有两个功能:(1)继承父类行为;(2)补充父类没有的(课本中)fight()行为。P160

  • 4.继承好处:(1)父类中定义的方法例如getName(),子类无需再次定义,可以直接取用;(2)数据成员例如name改为其他名称,直接改父类,子类无须再次修改。P162

  • 5.is-a关系:is-a中文翻译可译为是一种。继承除了可以避免类间重复行为定义外,还必须维持is-a关系,可以运用集合的方式来理解,程序语法从=右边往左边念,心中问自己右边是不是一种左边呢,完成is-a关系的判断。 P162

  • 6.强制扮演(cast):编译程序会检查父子间的“是一种”关系,有的时候这种检查会很“啰嗦”,为了避免只能在前面强制加上(想要扮演的角色类型),这段代码就会完成编译,但后果要自行负责,可能会出现——扮演失败,程序抛出ClassCastException。不同子类不能相互扮演(因为不满足is-a关系)例如:剑士不能扮演魔法师。P163

  • 7.多态定义:抽象来讲,就是使用单一接口操作多种类型的对象。对于课本范例,在showBlood()方法中,即可以通过Role类型操作剑士对象,也可以通过Role类型操作魔法师对象。 P166

  • 8.重新定义行为:在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。不同子类可以针对父类定义的方法重新定义不同的操作内容(但操作接口相同)。以fight()为例,方法调用的到底是role定义的fight()还是子类Magician定义的fight()呢?针对这个问题,如果该操作传入fight()的是Magician,则该方法为M定义的。P167
  • 9.区别重新定义与新定义:(1)重新定义是对待同一方法子类的修改;(2)新定义则是一种合法的方法定义,定义一种新方法,对之前的方法没有任何影响。两者定义格式一样,新定义的产生往往是拼写错误。此时就要使用@override,在重新定义方法那行代码的上一行写。 P169

  • 10.抽象方法和抽象类:方法区块fight(){}中实际上没有撰写任何程序代码,虽满足多态,但无法强迫任何子类操作该方法,易被遗忘。加上abstract关键字可以标志该方法为抽象方法,fight()后不跟{},直接;结束。 P169
  • 11.abstract关键字:(1)在类定义的时候class前一定标注abstract,否则下面又没操作则类定义不完整不能生成实例(2)目标抽象方法处声明一次abstract例如:public abstract void fight();(3)子类若继承抽象类也须class前加abstract。P170

6.2 继承语法细节
  • 1.protected成员:之前Role将name等定义为private,要想在子类角色中显示属性细节,则需要给予子类存取权限,权限关键字改为protected。 P171

  • 2.3(/4)种权限关键字及其范围:详见P172
  • 3.this与super关键字区别:(1)super关键字表示父类的意思。this变量代表对象本身。即super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。(2)调用super()必须写在子类构造方法的第一行,this必须写在构造函数第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。(3)super关键字调用的父类方法不能被定义为private。P173

  • 5.有关重新定义的方法权限:(1)重新定义方法要注意:对于父类中的方法权限,只能扩大不能缩小。(2)JDK5前重新定义除了权限关键字可以扩大,其他部分都不能改变。JDK5后,父类方法返回类型可以是子类。P174
  • 6.:super()指定执行构造函数:如果想在子类中执行父类中某构造函数,可以使用super()指定:(1)如果子类构造函数中没有指定执行父类中哪个构造函数,默认调用父类中无参数构造函数。super()括号内不填。(2)有参数输入则执行对应父类含相应参数的构造函数。P175

  • 7.final关键字:final可以限定方法或者class,限定后不可再被重新定义或继承。final定义变量无法改动。 P176

  • 8.java.lang.Object:如果定义类时没有使用extends关键字指定任何类,那一定是继承了java.lang.Object,它是最上层父类。任何类型的对象都可以用Object类型来参考。它的好处是使用数组收集各种对象。P178

收获与感想

终于写完了这篇简短的博客。在这里感谢两位同学,都是我在学习过程中遇到困难的时候借鉴过的好思路。一位是5213祁玮同学,他喜欢用幽默而又形象化的语言阐释抽象艰涩的理科概念,不同于有的优秀博客满篇代码通贴,他更侧重于理解消化后用自己的方式来阐释表达,真的特别有助于我理解;另外一位是高其同学,博客有多好我也不必多说了,他的博客的系统性无可挑剔,感觉大神的笔记对java菜鸟们是一手绝佳的参考资料。最后也给自己立个flag吧,别人一个周一篇博客,我一个周两篇到三篇,不拘泥于每周任务,只是希望对自己的java学习有帮助。好的,世界晚安。

转载于:https://www.cnblogs.com/xxy745214935/p/5339475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值