Skip to content

Java 多态练习笔记

练习一:接口与抽象类的区别

为什么需要使用接口而不是抽象类?

  • Java 不允许多重继承,一个类不能继承多个类;但可以实现多个接口,从而间接实现多重继承。
  • 接口定义了一组“行为契约”,实现该接口的类必须提供方法的具体实现。
  • 抽象类则可以提供部分默认实现。

接口与抽象类的对比

  • 接口
    • 所有方法默认是 public abstract(Java 8 起可包含默认实现 default)。
    • 成员变量是 public static final
    • 支持多实现。
  • 抽象类
    • 可以包含抽象方法和非抽象方法。
    • 成员变量可用各种访问修饰符。
    • 只能单继承。

示例代码

java
// 定义 Animal 抽象类和 Dog 类
abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("狗叫:汪汪");
    }
}

练习二:动物与狗的多态性

接口与实现

java
// 定义 Animal 接口
interface Animal {
    void makeSound();
}

// Dog 实现 Animal 接口
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("狗叫:汪汪");
    }
}

多态性示例

java
public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 多态:接口类型引用子类对象
        animal.makeSound();        // 输出:狗叫:汪汪
    }
}

你也可以添加其他动物类,比如:

java
class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("猫叫:喵喵");
    }
}

练习三:银行系统示例

接口定义

java
interface Account {
    void deposit(double amount);
    double withdraw(double amount);
    double getBalance();
}

储蓄账户实现

java
class SavingsAccount implements Account {
    private double balance;

    @Override
    public void deposit(double amount) {
        this.balance += amount;
        System.out.println("存款:" + amount);
    }

    @Override
    public double withdraw(double amount) {
        if (balance >= amount) {
            this.balance -= amount;
            System.out.println("取款:" + amount);
            return amount;
        } else {
            System.out.println("余额不足,无法取款。");
            return -1;
        }
    }

    @Override
    public double getBalance() {
        return balance;
    }
}

支票账户实现

java
class CheckingAccount implements Account {
    private double balance;

    @Override
    public void deposit(double amount) {
        this.balance += amount;
        System.out.println("存款:" + amount);
    }

    @Override
    public double withdraw(double amount) {
        if (balance >= amount) {
            this.balance -= amount;
            System.out.println("取款:" + amount);
            return amount;
        } else {
            System.out.println("余额不足,无法取款。");
            return -1;
        }
    }

    @Override
    public double getBalance() {
        return balance;
    }
}

银行系统主类

java
public class BankingSystem {
    public static void main(String[] args) {
        Account savings = new SavingsAccount();
        Account checking = new CheckingAccount();

        System.out.println("\n操作储蓄账户:");
        performTransaction(savings);

        System.out.println("\n操作支票账户:");
        performTransaction(checking);
    }

    private static void performTransaction(Account account) {
        account.deposit(100.0);
        account.withdraw(50.0);
        System.out.println("当前余额:" + account.getBalance());
    }
}

示例输出

操作储蓄账户:
存款:100.0
取款:50.0
当前余额:50.0

操作支票账户:
存款:100.0
取款:50.0
当前余额:50.0

总结

  • 接口适合定义一组规范行为,适用于灵活的系统设计。
  • 抽象类适合做通用模板,封装一部分实现逻辑。
  • 多态性是实现解耦与可扩展的重要机制。
  • 合理设计继承和实现结构,有助于构建灵活、可维护的系统。