一、什么是继承

现实世界中事物存在上下级从属关系,程序里用继承来描述通用父类、独有子类的层级结构。

• 核心作用:抽取多个子类公共属性、公共方法放到父类,代码复用;

• Java语法:class 子类 extends 父类

• 硬性规则:Java只支持单继承,一个子类只能直接继承一个父类,但支持多级继承。

二、继承的具体实现

1. 父类与子类基础代码演示
// 父类:动物
class Animal {
    String name;
    public void eat() {
        System.out.println("动物需要进食");
    }
}

// 子类:狗,继承动物
class Dog extends Animal {
    // 子类独有方法
    public void bark() {
        System.out.println("小狗汪汪叫");
    }
}
测试调用:
public class TestExtends {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.eat();  // 继承父类方法
        dog.bark(); // 自身独有方法
    }
}
运行结果:
动物需要进食
小狗汪汪叫
2. super关键字与构造方法执行顺序

子类构造方法执行时,会默认先调用父类无参构造super(),父类构造优先执行。

• super.成员变量:访问父类成员变量

• super.方法():调用父类成员方法

• super():调用父类构造方法,必须放在子类构造首行

三、方法重写(Override)

子类对父类继承过来的方法实现逻辑不满意,可以重新编写方法体,这就是方法重写。

1. 重写硬性规则

1. 方法名、参数列表、返回值类型(协变)必须和父类一致;

2. 访问权限不能比父类更严格(父类public,子类不能改成private);

3. 不能抛出比父类更大范围的异常;

4. 建议加@Override注解,编译器自动校验是否合法重写。

2. 重写代码示例
class Animal {
    public void eat() {
        System.out.println("动物进食");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("小猫吃鱼");
    }
}
四、继承与类型转换

分为向上转型(自动转换)、向下转型(强制转换)。

1. 向上转型(多态基础)

父类引用指向子类对象,自动完成,安全无异常。
格式:父类 引用名 = new 子类();
特点:只能调用父类中定义的方法,无法直接调用子类独有方法。
Animal a = new Dog(); // 向上转型
a.eat();
2. 向下转型(强制转换)

想要调用子类独有方法,必须强转回子类类型,有ClassCastException类型转换异常风险,建议配合instanceof判断。
Animal a = new Dog();
if(a instanceof Dog) {
    Dog d = (Dog)a;
    d.bark();
}
五、实用案例完整整合

整合继承、重写、转型、super全部知识点,可直接复制运行。
public class ExtendsDemo {
    public static void main(String[] args) {
        // 向上转型
        Animal ani = new Dog("大黄");
        ani.eat();

        // 向下强制转型
        if(ani instanceof Dog) {
            Dog dog = (Dog) ani;
            dog.bark();
        }
    }
}

class Animal {
    String name;
    public Animal(String name) {
        this.name = name;
    }
    public void eat() {
        System.out.println(name + "正在吃东西");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name); // 调用父类构造
    }
    @Override
    public void eat() {
        System.out.println(name + "啃骨头");
    }
    public void bark() {
        System.out.println(name + "汪汪叫");
    }
}
六、高频易错点总结

1. private私有成员无法被子类继承;

2. static静态方法重写不是真正重写,属于方法隐藏;

3. 向下转型不加instanceof极易报类型转换异常;

4. 构造方法不能被继承、不能重写。

更多推荐