继承基础

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

4.7 继承基础

1、泛型的动物类

  我们来看看另一个例子,这是一个由各种动物组成的世界,包括:狗(dog)、猫(cat)、猴子(monkey)、熊猫(panda)、袋熊(wombat)和水母(sea nettle)。

1)Dog类

从实现Dog类开始,一个Dog对象有年龄变量age(整数),还有eat()、sleep()和bark()函数(分别对应吃饭、睡觉和吠叫)。

class Dog{
    int age;
    Dog(){ 狗和猫都有相同的变量(age)和函数(eat()、sleep()
        age = 0;
    }
    void eat() {
        println("Yum!");
    }
    void sleep() {
        println("Zzzzzz");
    }
    void bark() { 狗会吠叫,所以还有个特殊的bark()函数
        println("WOOF!");
    }
}

2)Cat类

class Cat {
    int age;
    Cat() {
        age = 0;
    }
    void eat() {
        println("Yum!");
    }
    void sleep() {
        println("Zzzzzz");
    }
    void meow() {
      println("MEOW!");
    }
}

2、继承

  我们还要为鱼、马、考拉和狐猴分别写类重写同样的代码,这样的实现过程难免重复而单调。
  我们应该实现一个泛型的动物类(Animal)用于描述各种类型的动物。所有动物都会吃和睡,因此我们可以说:

  • 狗是动物的一种,它拥有动物的所有属性,动物能做什么,它就能做什么,除此之外,它还会吠叫;
  • 猫是动物的一种,它拥有动物的所有属性,动物能做什么,它就能做什么,除此之外,它还会喵喵叫。

  继承让上述需求的实现成为可能。
  通过继承,类可以从其他类中继承属性(变量)和功能(方法)。

  • Dog类是Animal类的子类,子类自动从父类中继承所有变量和函数,
    除此之外,子类还可以有父类没有的函数和变量。
  • 继承关系符合树形结构,就像是一棵不断演化的“生命之树”。
    比如,狗继承自犬类,犬类继承自哺乳动物,而哺乳动物则继承自动物。

3、继承的语法

class Animal { Animal类是父类(即超类)
    int age; Dog类和Cat类会继承age变量
    Animal() {
        age = 0;
    }
    void eat() { Dog类和Cat类会继承eat()和sleep()函数
        println("Yum!");
    }
    void sleep() {
        println("Zzzzzz");
    }
 }

class Dog extends Animal { "extends Animal"指Dog类是Animal类的子类
    Dog() {
        super(); super()函数执行父类中的代码
    }
    void bark() {
        println("WOOF!"); 我们在子类中定义bark()函数,因为它不是父类的一部分
    }
}

class Cat extends Animal {
    Cat() {
        super();
    }
    void meow() {
        println("MEOW!");
    }
}

这里有两个新关键字,如下。

  • extends 该关键词指出当前类的父类。注意,类只能直接继承一个父类,尽管如此,类的父类可以继承其他类。举个例子,狗继承自动物,梗犬则继承自狗。
    继承关系会自下而上一直延续下去。
  • super() 它会调用父类的构造函数。换句话说,你在父类的构造函数中做了什么,子类的构造函数也会做同样的事情。除了调用super()函数,你还可以在子类的构造函数中进行子类专有的初始化操作。
    如果父类的构造函数带有参数,super()函数也带有相同的参数。

4、定制

  • 子类可以拥有父类没有的功能和属性。
  • 如果狗对象的进食行为和一般动物不同,
    只需要在子类中重新定义eat()函数,把父类中的同名函数覆盖即可。
  • 但如果狗的进食行为和普通动物一样,仅仅是多了部分功能,这时候又该怎么实现?
    子类可以调用父类的函数,再加入属于自身的定制代码。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容