三妹开学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。
“二哥,今天我们要学习的内容是‘继承’,对吧?”看来三妹已经提前预习了我上次留给她的作业。
“是的,三妹。继承是 Java 中的一种机制。 ”我面带着朴实无华的微笑回答着她,“可以让子类继承到父类的状态和行为,是面向对象编程语言一个重要的部分。”
“继承背后的思想是,你可以在已有类的基础上新建一个类,新类就可以重用基类的方法和字段。当然了,新类中也可以添加属于自己的方法和字段。”
“继承反映了一种‘is-a’的关系,也就是所谓的父子关系。”
----正儿八经的分割线,正文开始------------
01、为什么要在 Java 中使用继承
继承的好处有两点:
通过方法的重写可以实现运行时多态;
提高代码的可重用性。
来了解一下继承方面的术语:
子类:子类是指继承了别的类的类,有时也叫派生类、扩展类;
父类:父类是指子类继承的类,有时也叫超类、基类;
可重用性:顾名思义,可重用性是一种机制,可以在创建新类的时候方便重用现有类中已经定义好的方法和字段。
继承的语法如下所示:
class Subclass-name extends Superclass-name
{
// 方法和字段
}
extends 关键字表明子类 Subclass 正在继承父类 Superclass,extends 的意思就是扩展,子类除了可以继承父类的资产(字段和方法),也可以新增父类中没有的字段和方法。
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
class Employee {
float salary = 40000;
}
class Programmer extends Employee {
int bonus = 10000;
public static void main(String args[]) {
Programmer p = new Programmer();
System.out.println("程序员的薪水是 " + p.salary);
System.out.println("程序员的奖金是:" + p.bonus);
}
}
程序员(Programmer)是一个雇员(Employee),它继承了父类的薪水(salary),又新增了奖金(bonus)。
02、 Java 中的继承有哪些类型
继承可以分为单继承、多重继承、不同类继承同一个类、多继承。文字上可能不太直观,我画了四幅图,来看一下。
四幅图看完后,是不是瞬间就清楚多了?那再来结合代码看一看,就更清楚明了了。
1)单继承
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
class Animal {
void eat() {
System.out.println("吃...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("叫唤...");
}
}
class SingleInheritanceDemo {
public static void main(String[] args) {
Dog d = new Dog();
d.bark();
d.eat();
}
}
在上面的例子中,Dog 继承了 Animal,所以 dog 除了 bark(),还可以 eat()。
2)多重继承
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
class Animal1 {
void eat() {
System.out.println("吃...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("叫唤...");
}
}
class BabyDog extends Dog {
void weep() {
System.out.println("嗷嗷地哭...");
}
}
class MultilevelInheritanceDemo {
public static void main(String[] args) {
BabyDog d = new BabyDog();
d.weep();
d.bark();
d.eat();
}
}
BabyDog 继承了 Dog,Dog 继承了 Animal,所以 BabyDog 不仅可以 weep(),还可以 bark() 和 eat()。
3)不同类继承同一个类
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
class Animal {
void eat() {
System.out.println("吃...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("汪汪汪...");
}
}
class Cat extends Animal {
void meow() {
System.out.println("喵喵喵...");
}
}
public class HierarchicalInheritanceDemo {
public static void main(String[] args) {
Cat c = new Cat();
c.meow();
c.eat();
Dog d = new Dog();
d.bark();
d.eat();
}
}
Cat 继承了 Animal,Dog 继承了 Animal,所以 cat 和 dog 都可以 eat()。
“二哥,为什么 Java 不支持多继承呢?”三妹问了一个面试官都喜欢问的问题。
“是这样啊,三妹。”这问题一点也难不倒我。“为了降低复杂性和简化语言,Java 不支持多继承。”
“考虑这样一个场景,其中 A、B、C 是三个类,C 类继承了 A 类和 B 类,如果 A 类和 B 类具有相同的方法,子类对象想调用这个方法,那究竟是该调用 A 类的方法还是 B 类的方法呢?”
03、ending
“三妹,关于 Java 中的继承,我们就学到这里吧,它的用法我相信你一定全部掌握了。”我揉一揉犯困的双眼,疲惫地给三妹说。
“好的,二哥,我这就去练习去。”三妹似乎意犹未尽,这种学习状态真令我感到开心。