第 7 章 · 面向对象(上)

7.1 面向对象的概念

面向对象以对象为核心,把数据与操作数据的方法封装在一起,核心特征:封装、继承、多态。相比面向过程“先做什么再做什么”,面向对象先思考“有哪些对象、对象如何协作”。

7.2 类与对象

类是对象的模板,对象是类的实例。

class Person {
    String name;          // 成员变量(字段)
    int age;

    void sayHello() {     // 成员方法
        System.out.println("Hi, I'm " + name);
    }
}

Person p = new Person();  // 用 new 创建对象
p.name = "Tom";
p.sayHello();
  • new 在堆上分配内存,返回对象引用。
  • 封装:用 private 隐藏字段,提供 getter/setter 控制访问。
class Person {
    private int age;
    public int getAge() { return age; }
    public void setAge(int age) {
        if (age < 0) throw new IllegalArgumentException("非法年龄");
        this.age = age;
    }
}

7.3 构造方法

  • 名称与类同名、无返回类型,new 时自动调用,用于初始化对象。
  • 可重载;不写时编译器提供默认无参构造。
  • 一旦定义了有参构造,默认无参构造会失效(需要时手动补)。
Person(String name, int age) {
    this.name = name;
    this.age = age;
}

7.4 this 关键字

this 指代当前对象:区分成员变量与局部变量(this.age = age)、调用本类其他构造(this(...))。

7.5 垃圾回收(GC)

对象不再被任何引用指向时成为垃圾,由 JVM 的 GC 自动回收,无需也不能手动 free。可建议回收(System.gc()),但时机由 JVM 决定。

对比:C 手动 malloc/free 易泄漏、易悬空指针;C++ 靠析构函数与 RAII 自动管理资源;Java 用 GC 彻底解放堆内存管理,但无法精确控制回收时机(不适用实时系统)。

7.6 static 关键字

static 修饰的成员属于而非实例,全类共享一份:

class Counter {
    static int count = 0;   // 静态变量
    static int next() { return ++count; }  // 静态方法
}
Counter.next();             // 类名直接调用,无需 new
  • 静态方法只能直接访问静态成员;实例方法可访问静态成员。
  • 单例模式:私有构造 + 静态方法返回唯一实例,是 static 的经典应用。

7.7 内部类

定义在类内部的类:

  • 成员内部类:持有外部类引用,可访问外部类私有成员。
  • 静态内部类:不依赖外部实例,类似独立类。
  • 方法内部类 / 匿名内部类:局部定义,常用于事件回调。

7.8 与其他语言对比

  • C++:类可定义在栈上(值语义),Java 对象一律在堆上通过引用访问;C++ 需显式写析构,Java 靠 GC。
  • Pythonself 需显式作为首参,Java 的 this 隐式;Python 没有真正的 private(靠约定),Java 有访问控制。