Java继承的概念与实现
周sir |
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继承的概念与实现
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。