面向对象(OOP)是 Java 的核心思想:把数据和操作数据的方法组织成"对象",用类描述同一类对象的模板。这篇用可以运行的示例讲清三大特性。

类与对象

public class Dog {
    String name;

    void bark() {
        System.out.println(name + ":汪汪!");
    }
}
Dog d = new Dog();
d.name = "旺财";
d.bark();    // 输出:旺财:汪汪!

类是图纸,对象是按图纸造出来的实例,new 负责创建对象。

构造方法

public class Dog {
    String name;
    int age;

    // 构造方法:与类同名、无返回值,new 的时候自动调用
    public Dog(String name, int age) {
        this.name = name;   // this 指当前对象
        this.age = age;
    }
}
Dog d = new Dog("旺财", 2);

封装:private + 方法访问

把字段设为 private,外界只能通过公共方法读写,校验逻辑就有了安放之处:

public class BankAccount {
    private double balance;    // 余额只能通过方法修改

    public void deposit(double amount) {
        if (amount <= 0) {
            System.out.println("存款金额必须大于 0");
            return;
        }
        balance += amount;
    }

    public double getBalance() {
        return balance;
    }
}

外界无法直接改 balance,只能走 deposit(),数据就安全了。

继承:extends

public class Animal {
    public void eat() {
        System.out.println("吃东西");
    }
}

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("小猫吃鱼");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("小狗啃骨头");
    }
}

子类自动获得父类的成员,并用 @Override 重写父类方法,提供自己的实现。

多态:同一个调用,不同表现

Animal[] zoo = { new Cat(), new Dog() };

for (Animal animal : zoo) {
    animal.eat();
}
// 输出:
// 小猫吃鱼
// 小狗啃骨头

变量类型都是 Animal,但运行时调用的是各自子类的实现——调用哪个版本由对象的实际类型决定,这就是多态。

Animal a = new Cat();   // 父类引用指向子类对象
a.eat();                // 小猫吃鱼

小结

  • 类是模板,对象是实例,new 创建对象,构造方法完成初始化
  • 封装:private 隐藏字段,公共方法控制访问并加校验
  • 继承:extends 复用父类代码,@Override 重写方法
  • 多态:父类引用指向子类对象,运行时决定行为

面向对象是读懂 Java 框架源码的前提,建议把示例亲手敲一遍加深理解。