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