Java继承的概念与实现

    |     2015年3月30日   |   Java面向对象   |     0 条评论   |    1752

继承是类与类之间的关系,和现实里「儿子继承父亲财产」类似:一个类从另一个类拿到方法和属性。若 B 继承 A,B 就拥有 A 里可被继承的成员。

语法用 extends。Java 类是单继承:一个类只能有一个直接父类。多个类型可以靠接口来组合,接口之间可以多继承。

一、从 People 到 Teacher

已经有一个 People 类:

class People {
    String name;
    int age;
    int height;

    void say() {
        System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height);
    }
}

现在要写 Teacher:同样有 name、age、height 和 say(),还要加 school、subject、seniority 和 lecturing()。不必从头再写一遍,先继承 People,再补自己的成员,需要时覆盖 say():

class Teacher extends People {
    String school;   // 所在学校
    String subject;  // 学科
    int seniority;   // 教龄

    void say() {
        System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄");
    }

    void lecturing() {
        System.out.println("我已经" + age + "岁了,依然站在讲台上讲课");
    }
}
  • name、age 没在 Teacher 里声明,却能直接用,因为父类已经有了。
  • Teacher 是 People 的子类,People 是 Teacher 的父类。
  • 子类可以覆盖父类方法,也可以新增自己的方法。
  • 子类继承父类中 除 private 以外的成员(原文「以为」应为「以外」)。
  • 构造方法不能被继承。

维护上这是进步:改 People,Teacher 自动带上变更,程序员主要负责重新编译。当然,覆盖过的方法不会跟着父类实现一起变。

二、完整示例

public class Demo {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.name = "小布";
        t.age = 70;
        t.school = "清华大学";
        t.subject = "Java";
        t.seniority = 12;
        t.say();
        t.lecturing();
    }
}
class People {
    String name;
    int age;
    int height;

    void say() {
        System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height);
    }
}
class Teacher extends People {
    String school;
    String subject;
    int seniority;

    void say() {
        System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄");
    }

    void lecturing() {
        System.out.println("我已经" + age + "岁了,依然站在讲台上讲课");
    }
}
// 运行结果:
// 我叫小布,在清华大学教Java,有12年教龄
// 我已经70岁了,依然站在讲台上讲课

三、单继承与构造方法

规则 说明
单继承 一个类只能 extends 一个父类
接口 类可实现多个接口;接口可继承多个接口
构造方法 不能继承。要么自己写,要么一个都不写,由编译器给默认无参构造

掌握「构造方法不能继承」很重要:子类构造里若要初始化父类状态,应写 super(...),而不是指望把父类构造「抄」过来。

一句话总结:extends 拿走父类非 private 成员,可以覆盖和扩展;类只能单继承,构造方法必须自己写或用默认构造。

转载请注明来源:Java继承的概念与实现
本文链接地址:https://ai.zhousir.top/?p=78
回复 取消