封装、继承与多态
封装、继承、多态是面向对象的三大特性,是 Java 设计的基石。
封装
把属性设为 private,通过 public 的 getter/setter 方法受控访问,保护数据不被随意修改:
public class Account {
private double balance; // 私有属性,外部无法直接访问
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) { // 在方法中做校验
balance += amount;
}
}
}
访问修饰符权限从宽到严:
| 修饰符 | 同类 | 同包 | 子类 | 任意 |
|---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
| 默认(不写) | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
继承
子类用 extends 继承父类,复用其非私有成员。Java 只支持单继承:
public class Animal {
String name;
public void eat() {
System.out.println(name + " 在吃东西");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println(name + " 在汪汪叫");
}
}
Dog dog = new Dog();
dog.name = "旺财";
dog.eat(); // 继承自 Animal
dog.bark(); // Dog 自己的方法
子类构造方法中可以用 super(...) 调用父类构造,super.方法() 调用父类被重写的方法。
方法重写(Override)
子类重新实现父类中签名相同的方法:
public class Dog extends Animal {
@Override
public void eat() {
System.out.println(name + " 在啃骨头");
}
}
@Override 注解让编译器帮忙检查,建议养成书写的习惯。
多态
父类引用指向子类对象,调用方法时执行的是子类的实现(动态绑定):
Animal a = new Dog(); // 编译时类型 Animal,运行时类型 Dog
a.eat(); // 输出:旺财 在啃骨头(执行 Dog 的重写)
多态的价值:用统一的父类类型操作不同的子类,轻松扩展新类型而不用改动原有代码。