Skip to content

Inheritance

文件信息

  • 📄 原文件:Inheritance.java
  • 🔤 语言:java

Java 继承与多态 本文件介绍 Java 中的继承、方法重写、多态等概念。

完整代码

java
/**
 * ============================================================
 *                    Java 继承与多态
 * ============================================================
 * 本文件介绍 Java 中的继承、方法重写、多态等概念。
 * ============================================================
 */
public class Inheritance {

    public static void main(String[] args) {
        basicInheritance();
        methodOverriding();
        polymorphism();
        abstractClasses();
        finalKeyword();
        objectMethods();
    }

    /**
     * ============================================================
     *                    1. 基本继承
     * ============================================================
     */
    public static void basicInheritance() {
        System.out.println("=".repeat(60));
        System.out.println("1. 基本继承");
        System.out.println("=".repeat(60));

        // 创建子类对象
        Dog dog = new Dog("旺财", 3);
        dog.eat();      // 继承的方法
        dog.bark();     // 子类特有方法
        System.out.println();

        Cat cat = new Cat("咪咪", 2);
        cat.eat();
        cat.meow();

        // 访问继承的属性
        System.out.println("\n" + dog.name + " 是一只 " + dog.getAge() + " 岁的狗");
    }

    /**
     * ============================================================
     *                    2. 方法重写
     * ============================================================
     */
    public static void methodOverriding() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("2. 方法重写");
        System.out.println("=".repeat(60));

        Animal animal = new Animal("动物", 1);
        Dog dog = new Dog("旺财", 3);
        Cat cat = new Cat("咪咪", 2);

        // 调用重写的方法
        System.out.println("--- 调用 speak() 方法 ---");
        animal.speak();  // Animal 的实现
        dog.speak();     // Dog 重写的实现
        cat.speak();     // Cat 重写的实现

        // super 关键字
        System.out.println("\n--- super 关键字 ---");
        dog.eatWithSuper();
    }

    /**
     * ============================================================
     *                    3. 多态
     * ============================================================
     */
    public static void polymorphism() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("3. 多态");
        System.out.println("=".repeat(60));

        // 【向上转型】父类引用指向子类对象
        System.out.println("--- 向上转型 ---");
        Animal animal1 = new Dog("旺财", 3);
        Animal animal2 = new Cat("咪咪", 2);

        animal1.speak();  // 调用的是 Dog 的 speak()
        animal2.speak();  // 调用的是 Cat 的 speak()

        // 【多态数组】
        System.out.println("\n--- 多态数组 ---");
        Animal[] animals = {
            new Dog("小黑", 1),
            new Cat("小白", 2),
            new Dog("大黄", 4)
        };

        for (Animal animal : animals) {
            animal.speak();  // 运行时决定调用哪个方法
        }

        // 【向下转型】需要强制类型转换
        System.out.println("\n--- 向下转型 ---");
        Animal a = new Dog("旺财", 3);

        if (a instanceof Dog) {
            Dog d = (Dog) a;  // 向下转型
            d.bark();         // 可以调用 Dog 特有方法
        }

        // 【instanceof 模式匹配】(Java 16+)
        if (a instanceof Dog d2) {  // 直接声明变量
            d2.bark();
        }

        // 【错误的向下转型】
        Animal a2 = new Cat("咪咪", 2);
        // Dog d = (Dog) a2;  // ClassCastException!

        // 【多态参数】
        System.out.println("\n--- 多态参数 ---");
        feedAnimal(new Dog("小狗", 1));
        feedAnimal(new Cat("小猫", 1));
    }

    public static void feedAnimal(Animal animal) {
        System.out.println("喂食 " + animal.name);
        animal.eat();
    }

    /**
     * ============================================================
     *                    4. 抽象类
     * ============================================================
     */
    public static void abstractClasses() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("4. 抽象类");
        System.out.println("=".repeat(60));

        // Shape shape = new Shape();  // 错误!不能实例化抽象类

        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(4, 3);

        System.out.println("圆形面积: " + circle.area());
        System.out.println("圆形周长: " + circle.perimeter());
        System.out.println();
        System.out.println("矩形面积: " + rectangle.area());
        System.out.println("矩形周长: " + rectangle.perimeter());

        // 调用抽象类中的具体方法
        circle.describe();
    }

    /**
     * ============================================================
     *                    5. final 关键字
     * ============================================================
     */
    public static void finalKeyword() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("5. final 关键字");
        System.out.println("=".repeat(60));

        System.out.println("""
            final 用途:

            1. final 变量:常量,不能重新赋值
               final int MAX = 100;

            2. final 方法:不能被子类重写
               public final void method() { }

            3. final 类:不能被继承
               public final class String { }

            4. final 参数:方法内不能修改
               void method(final int x) { }
            """);

        // final 变量
        final int MAX_VALUE = 100;
        // MAX_VALUE = 200;  // 编译错误

        // final 引用类型
        final StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");  // 可以修改对象内容
        // sb = new StringBuilder();  // 编译错误,不能重新赋值
        System.out.println("final StringBuilder: " + sb);
    }

    /**
     * ============================================================
     *                    6. Object 类方法
     * ============================================================
     */
    public static void objectMethods() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("6. Object 类方法");
        System.out.println("=".repeat(60));

        // 所有类都继承自 Object

        Student s1 = new Student("Alice", 20);
        Student s2 = new Student("Alice", 20);
        Student s3 = s1;

        // 【toString()】
        System.out.println("--- toString() ---");
        System.out.println("s1.toString(): " + s1.toString());
        System.out.println("直接打印: " + s1);

        // 【equals()】
        System.out.println("\n--- equals() ---");
        System.out.println("s1 == s2: " + (s1 == s2));           // false
        System.out.println("s1.equals(s2): " + s1.equals(s2));   // true
        System.out.println("s1 == s3: " + (s1 == s3));           // true

        // 【hashCode()】
        System.out.println("\n--- hashCode() ---");
        System.out.println("s1.hashCode(): " + s1.hashCode());
        System.out.println("s2.hashCode(): " + s2.hashCode());
        System.out.println("相等对象的 hashCode 应该相同: " + (s1.hashCode() == s2.hashCode()));

        // 【getClass()】
        System.out.println("\n--- getClass() ---");
        System.out.println("s1.getClass(): " + s1.getClass());
        System.out.println("s1.getClass().getName(): " + s1.getClass().getName());
        System.out.println("s1.getClass().getSimpleName(): " + s1.getClass().getSimpleName());

        // 【clone()】需要实现 Cloneable 接口
        System.out.println("\n--- clone() ---");
        try {
            Student s4 = (Student) s1.clone();
            System.out.println("克隆后: " + s4);
            System.out.println("s1 == s4: " + (s1 == s4));
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

// ============================================================
//                    辅助类定义
// ============================================================

/**
 * 动物基类
 */
class Animal {
    protected String name;
    private int age;

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

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

    public void speak() {
        System.out.println(name + " 发出声音");
    }

    public int getAge() {
        return age;
    }
}

/**
 * 狗类 - 继承 Animal
 */
class Dog extends Animal {

    public Dog(String name, int age) {
        super(name, age);  // 调用父类构造函数
    }

    // 子类特有方法
    public void bark() {
        System.out.println(name + ": 汪汪汪!");
    }

    // 重写父类方法
    @Override
    public void speak() {
        System.out.println(name + ": 汪汪!");
    }

    // 使用 super 调用父类方法
    public void eatWithSuper() {
        super.eat();  // 调用父类的 eat()
        System.out.println("  (狗狗吃得很香)");
    }
}

/**
 * 猫类 - 继承 Animal
 */
class Cat extends Animal {

    public Cat(String name, int age) {
        super(name, age);
    }

    public void meow() {
        System.out.println(name + ": 喵喵喵~");
    }

    @Override
    public void speak() {
        System.out.println(name + ": 喵~");
    }
}

/**
 * 形状抽象类
 */
abstract class Shape {
    protected String color = "white";

    // 抽象方法:子类必须实现
    public abstract double area();
    public abstract double perimeter();

    // 具体方法:子类可以继承
    public void describe() {
        System.out.println("这是一个 " + color + " 的形状");
        System.out.println("面积: " + area() + ", 周长: " + perimeter());
    }
}

/**
 * 圆形
 */
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    @Override
    public double perimeter() {
        return 2 * Math.PI * radius;
    }
}

/**
 * 矩形
 */
class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }

    @Override
    public double perimeter() {
        return 2 * (width + height);
    }
}

/**
 * 学生类 - 演示 Object 方法重写
 */
class Student implements Cloneable {
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student student = (Student) obj;
        return age == student.age && name.equals(student.name);
    }

    @Override
    public int hashCode() {
        return java.util.Objects.hash(name, age);
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布