1、第九讲 继承,面向对象的三大基石之二 继承,回顾,什么是封装? 实现封装的具体步骤? 什么是方法重载? 什么是构造方法?,提问,本章案例,设计动物世界的继承树 富一代和富二代刷卡,案例演示,本章目标,理解继承的概念 掌握extends关键字 掌握super关键字 掌握方法重写(override),关于继承不得不说的故事,那么现实生活中动物世界的继承关系是怎样的呢?我们通过3个步骤分析出现实生活中动物世界的继承树。,动物世界的继承树,找出具有共同属性和行为的对象,设计代表共同状态和行为的类。 以下6张图片有什么共同点?,动物世界的继承树,它们都有年龄、体重的属性,都具有发出叫声、进食、睡觉、散步
2、的行为,最主要的是它们都是动物,因此我们抽象出一个动物类作为父类。,动物,动物世界的继承树,寻找具有共同特征和行为的子类。 我们观察到狼与狗有某些共同的特征和行为,狮子、老虎、猫有某些共同的特征和行为,因此我们又抽象出两个子类:犬科动物、猫科动物,它们继承自动物类。河马既没有猫科动物的特征又没有犬科动物的特征,它直接继承自动物类。,猫科动物,犬科动物,动物,动物世界的继承树,最后,猫、狮子、老虎继承猫科动物,狗、狼继承犬科动物,完成类的继承层次。,猫科动物,犬科动物,动物,哪个是父类? 哪个是子类? 哪位同学能来总结一下继承的特点?,狮子是猫科动物吗? 狮子是动物吗? 继承需要符合的关系:is
3、-a,父类更一般、子类更具体,交通工具的继承树,子类具有父类的属性和行为,以及自身特殊的属性和行为。,火车是交通工具吗? 轮船是交通工具吗? 飞机是交通工具吗?,请问:飞机包含哪些属性和行为呢?,交通工具,Dont reinvent wheels(不要重新发明车轮),在java中为什么需要继承,又如何应用继承呢?我们在不用继承的前提下设计出富一代和富二代两个类,如下页所示:,Dont reinvent wheels(不要重新发明车轮),注意看,下面的富一代类和富二代类有没有问题呢?,软件开发的万恶之源,其中之一就是重复代码而不重用代码,这种大量重复代码的写法显然是不可原谅的。如何避免这种冗余代
4、码呢?如何做到面向对象编程的一个重要原则:write once,only once(编写一次,且仅编写一次)呢?,注意红色的大括号部分,两个类里存在大量重复的代码,Dont reinvent wheels(不要重新发明车轮),不要重新发明车轮,我们用继承,我们可以抽象(抽取出像的部分)出一个父类。子类会去继承父类的属性和方法,还可以扩展出自己特有的属性和方法。,富一代是富人吗? 富二代是富人吗?,富人,富一代,富二代,protected关键字,子类中重复的属性被提取到了父类中,子类中重复的方法被提取到了父类中,Dont reinvent wheels(不要重新发明车轮),子类中再也没有重复的代
5、码了,子类可以继承父类的属性和方法,成功的避免了代码冗余,继承可以防止子类中出现重复的程序代码,继承的实现细节,extends关键字,上例中富一代类继承了富人类,注意类名后面的extends关键字,Java中使用extends关键字表示一个类继承了另一个类。extends的含义是扩展,意味着子类除了继承了父类的属性和方法外,还可以扩展出自己特殊的属性和方法。,继承的实现细节,方法重写(override),子类中刷卡方法和父类实现有所不同,所以重写了该方法,方法重写的3大特点: 发生在父类与子类之间 方法名相同,参数列表相同,返回类型相同 子类重写方法的访问权限=父类被重写的方法,继承的实现细节
6、,super关键字,子类构造方法中使用super关键字调用父类构造方法,子类重写方法中使用super关键字调用父类方法,在子类的构造方法中通过super关键字可以调用父类的构造方法,但必须位于子类构造方法的第一句。,课堂练习,编码实现军事世界的继承关系。 军队(Army)具有行为:打击敌人(Beat)、保卫国家(Defend)。 军队包括海军(Navy)、陆军(LandArmy)、空军(Airforce)。 这些部队打击敌人的行为各不相同(海军用鱼雷打击敌人,陆军用坦克打击敌人,空军用导弹打击敌人);但是他们保卫国家的行为是一致的。 使用继承完成以上需求,并编写测试类测试。,演示:规范代码,小
7、结,Java中使用()关键字表示一个类继承了另一个类 方法重写有哪些特点? super关键字的具体用法?应该注意哪些问题?,个性的继承,继承关系是可传递的 子类除了可以调用父类的方法,也可以调用父类的父类的方法,也就是说继承可以确保某个父类型之下的所有类都会有父类型所持有的全部方法。 最终类 Java还有一个关键字final,用它修饰的类不能被继承,称为最终类。不想被其他类继承的工具类一般都会做成最终类,我们以前学过的Math类就是最终类。 单一继承性 Java不支持多重继承,因为多重继承会有称为“致命方块”的问题,如下图所示:,致命方块,DVD康宝驱动器继承自CDRW刻录机和DVD光驱,那么
8、当他调用burn()方法时到底是调用哪个父类重写的版本呢?,CDRW刻录机和DVD光驱都继承自数字记录器,且两者都重写了burn()方法,因此Java基于简单化的原则而不允许这种致命方块的出现。 也就是说 public class ComboDrive extends CDBurner,DVDBurner 是不可以的,子类构造方法与父类构造方法的微妙关系,?,等我长大以后我要生一对父母,最好是一男一女,小孩能够在父母之前出生吗?,Java语言在创建对象时,先创建父类对象,再创建子类对象。,子类构造方法与父类构造方法的微妙关系,子类构造方法显式调用父类构造方法 如果父类只提供了带参的构造方法而没
9、有提供默认无参的构造方法,那么子类构造方法中必须显式的调用父类带参的构造方法。,父类只提供了一个带参的构造方法,子类构造方法中必须显式的调用父类带参的构造方法,在子类的构造方法中通过super关键字可以调用父类的构造方法,但必须位于子类构造方法的第一句。,子类构造方法与父类构造方法的微妙关系,子类构造方法隐式调用父类构造方法 如果子类构造方法中没有显式的使用super关键字明确指明调用父类的哪个构造方法,子类构造方法此时就会隐式的调用父类的默认无参构造方法。此时父类必须有一个默认的无参构造方法。,子类构造方法没有显示调用父类带参构造方法,父类又没有提供默认无参构造方法,会出现什么结果呢?,子类
10、构造方法与父类构造方法的微妙关系,没有通过编译,提示“Implicit super constructor Rich() is undefined. Must explicitly invoke another constructor”,默认的父类构造方法Rich()没有定义,必须明确的调用其他构造方法。,总结,在继承关系中,父类和子类需要满足()的关系。 继承可以防止子类中出现()的程序代码,也就是实现代码()。 什么是方法重写?方法重写的特点? super关键字的具体用法?需要注意什么? Java中可以同时继承自多个父类吗? 子类构造方法中调用父类构造方法需要注意哪些问题? 子类可以继承父类的()和(),还可以扩展出自己特殊的()和()。,提问,Thank You!,