首页 > 编程笔记 > Java笔记 阅读:24

什么是继承,Java继承的具体实现(附带实例)

继承是面向对象编程中最重要的概念之一,从字面上来理解就是从前者那里得到前者所拥有的能力,也就是说某个类能通过继承来得到另一个类的属性和方法。


图 1 人的继承

举一个例子,如上图所示,人具有年龄属性和行走能力,女人和男人都继承了人,那么他们也都具有年龄属性和行走能力。此时,女人可以添加生孩子的能力,而男人则可以添加干重体力活的能力。继续往下继承,女厨师、女学生和女教师可以继续继承女人,从而拥有女人的属性和能力。而男厨师、男学生和男教师则可以继承男人,从而拥有男人的属性和能力。

面向对象编程是根据客观世界规律所提出的一种编程思想,某些对象之间具有某种关系,而继承的性质刚好符合这种关系,所以需要用继承机制来描述。

总的来说,继承能给我们带来下面两个好处:

Java继承的具体实现

下面我们来看看 Java 如何实现类的继承。整体语法如下:
访问修饰符 class 类名 extends 父类名{
    ......
}
前半部分是我们熟悉的常规类定义语法,重点是后半部分,可以看到是通过 extends 关键字来指定父类的。

为了让大家能更好地理解什么是继承,下面通过实例来进行说明:
public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void eat() {
        System.out.println("吃东西");
    }
}
我们定义了 Person 类,该类包含了 name 和 age 两个属性,同时具有吃东西的能力。

接着我们定义一个 Woman 类,由于它具有 Person 类的属性和能力,所以可以通过继承的方式来描述该类:
public class Woman extends Person {
    boolean isDelivered;

    Woman(String name, int age, boolean isDelivered) {
        super(name, age);
        this.isDelivered = isDelivered;
    }

    public void deliver() {
        System.out.println("生小孩");
        this.isDelivered = true;
    }
}
此时的 Woman 类便具有了 name 和 age 两个属性以及 eat() 方法,这样我们就可以避免编写重复的代码了。假如 Woman 类还要增加是否生过小孩的属性和生小孩的方法,那么可以直接在 Woman 类中添加 isDelivered 属性和 deliver() 方法。

定义好 Woman 类后我们来测试一下效果:
public class Woman extends Person {
    ......
    public static void main(String[] args) {
        Woman w = new Woman("小莉", 25, false);
        w.eat();
        w.deliver();
        System.out.println(w.name + " " + w.age + " " + w.isDelivered);
    }
}
运行结果为:

吃东西
生小孩
小莉 25 true

程序中创建一个 Woman 对象“小莉”,然后分别调用它的 eat() 方法和 deliver() 方法,并且将它的属性都打印出来。从中我们可以清晰地看到继承的效果,Woman 类具有了 Person 类的所有属性和方法,并且还能根据自己的需要添加属性和方法。
 
Java 语言只支持单继承的方式,它不像 C++ 语言可以进行多继承。所谓的单继承是指某个子类只可以继承一个父类,而多继承则指某个子类可以继承多个父类。如下图所示,类 B 继承类 A 是可以的,但是类 C 同时继承类 A 和类 B 则是不允许的。


图 2 只支持单继承

Java父子类的转换

当两个类互为父类和子类时,将子类对象转换为父类对象的过程称为向上转换。向上转换在 Java 中是允许的,因为子类肯定具有父类的所有属性和方法,所以能够安全地将子类对象转换为父类对象。

仍然以 Person 类和 Woman 类为例,将 Woman 对象转换为 Person 对象是允许的,它可以调用 Person 类拥有的 eat() 方法,但是它无法调用 Woman 类拥有的 deliver() 方法,代码如下:
public class InheritanceTest2 {
    public static void main(String[] args) {
        Person p = new Woman("小莉", 25, false);
        p.eat();
    }
}

与向上转换相反的是向下转换,向下转换是将父类对象转换为子类对象,这种情况是不允许的,因为子类具有比父类更多的属性和方法,所以不能安全地进行转换。下面的代码运行时将报转换异常“java.lang.ClassCastException”。
public class InheritanceTest3 {
    public static void main(String[] args) {
        Woman w = (Woman) new Person("小莉", 25);
        w.eat();
    }
}

相关文章