2.1 类与对象


文档摘要

Java 类与对象:面向对象编程(OOP)核心基石详解 核心摘要:在 Java 编程语言中,「万物皆对象」是核心设计哲学。深入理解类与对象是掌握面向对象编程(OOP) 的关键前提。本文全面解析 Java 中类与对象的核心概念、JVM 内存模型、实例化过程、构造方法及访问控制机制,旨在帮助开发者构建高内聚、低耦合的现代化软件系统。 什么是类(Class)? 类(Class)是对象的蓝图或模板,定义了对象的属性(数据状态)和行为(方法功能)。在软件工程中,类是对现实世界实体的抽象,描述了将要创建的对象的结构与能力。 属性(Attributes/Fields):描述对象的状态或特征。例如, 类包含 (颜色)、 (型号)、 (速度)等属性。

Java 类与对象:面向对象编程(OOP)核心基石详解

核心摘要:在 Java 编程语言中,「万物皆对象」是核心设计哲学。深入理解类与对象是掌握面向对象编程(OOP) 的关键前提。本文全面解析 Java 中类与对象的核心概念、JVM 内存模型、实例化过程、构造方法及访问控制机制,旨在帮助开发者构建高内聚、低耦合的现代化软件系统。

什么是类(Class)?

类(Class)是对象的蓝图或模板,定义了对象的属性(数据状态)和行为(方法功能)。在软件工程中,类是对现实世界实体的抽象,描述了将要创建的对象的结构与能力。

  • 属性(Attributes/Fields):描述对象的状态或特征。例如,Car 类包含 color(颜色)、model(型号)、speed(速度)等属性。
  • 行为(Behaviors/Methods):描述对象可执行的操作或功能。例如,Car 类包含 accelerate()(加速)、brake()(刹车)、turn()(转向)等方法。

类结构图示:

代码示例:

public class Car { // 属性(Attributes) String color; String model; int speed; // 方法(Methods) public void accelerate() { speed += 10; System.out.println("加速!当前速度:" + speed); } public void brake() { speed -= 5; if (speed < 0) { speed = 0; } System.out.println("刹车!当前速度:" + speed); } public void turn(String direction) { System.out.println("向" + direction + "转弯"); } }

上述代码中,Car 类精确定义了汽车的状态特征与动态行为,为后续创建具体实体提供了标准规范。

什么是对象(Object)?

对象(Object)是类的具体实例,是根据类蓝图在内存中分配并创建出来的实际实体。

  • 实例化(Instantiation):创建对象的过程称为实例化,在 Java 中通过 new 关键字触发。
  • 状态(State):对象具有独立的状态,由其属性的具体值决定。同一类的不同对象可拥有完全不同的状态。
  • 行为(Behavior):对象可执行类中定义的方法,通过方法调用来改变自身状态或完成特定业务逻辑。

代码示例:

public class Main { public static void main(String[] args) { // 实例化 Car 类的两个独立对象 Car myCar = new Car(); Car yourCar = new Car(); // 配置 myCar 对象的状态 myCar.color = "红色"; myCar.model = "宝马"; myCar.speed = 0; // 配置 yourCar 对象的状态 yourCar.color = "蓝色"; yourCar.model = "奔驰"; yourCar.speed = 0; // 调用 myCar 对象的行为 myCar.accelerate(); // 输出:加速!当前速度:10 myCar.turn("左"); // 输出:向左转弯 // 调用 yourCar 对象的行为 yourCar.brake(); // 输出:刹车!当前速度:0 System.out.println("yourCar的速度:" + yourCar.speed); } }

在此示例中,myCaryourCar 是相互独立的实体,各自维护专属的属性值,互不干扰。

类与对象的核心关系

类是静态的代码结构,对象是动态的内存实体。两者之间的关系可概括为“模板与产品”的关系。

类与对象实例化图示:

  • 一对多映射:一个类可实例化出无数个对象,每个对象都是该类的一个独立副本。
  • 内存隔离:对象之间相互独立,修改对象 A 的状态绝不会影响对象 B。
  • 生命周期差异:类在类加载阶段存在于方法区(元空间),而对象在运行时动态创建于堆内存中。

对象的内存分配机制(JVM 堆与栈)

深入理解 Java 类与对象,必须掌握其在 JVM(Java 虚拟机)中的内存分配原理。

  1. 堆内存(Heap):所有通过 new 关键字创建的对象实例及其属性数据,均存储在堆内存中。堆是垃圾回收器(GC)管理的主要区域。
  2. 栈内存(Stack):局部变量(包括对象的引用变量)存储在栈内存中。引用变量本身不包含对象数据,而是存储指向堆内存中对象实体的内存地址。

核心机制:当执行 Car myCar = new Car(); 时,new Car() 在堆中分配内存创建实体,而 myCar 作为引用变量在栈中分配内存,并保存堆中实体的地址。

创建类与实例化对象

1. 定义类结构

使用 class 关键字声明类,并定义其内部成员。

public class Dog { // 属性定义 String name; String breed; int age; // 行为定义 public void bark() { System.out.println("汪汪!"); } public void eat(String food) { System.out.println(name + "正在吃" + food); } }

2. 实例化与成员访问

通过 new 关键字分配内存,并使用点运算符(.)访问成员。

// 实例化对象 Dog myDog = new Dog(); // 赋值属性 myDog.name = "旺财"; myDog.breed = "金毛"; myDog.age = 3; // 调用方法 System.out.println("我的狗狗叫" + myDog.name + ",是一只" + myDog.breed + ",今年" + myDog.age + "岁了。"); myDog.bark(); myDog.eat("高级狗粮");

构造方法(Constructor)与初始化

构造方法是类中用于初始化对象状态的特殊方法,在对象实例化时自动调用。

  • 命名规则:方法名必须与类名完全一致。
  • 返回值:无返回值类型声明(连 void 也不允许)。
  • 默认机制:若未显式定义任何构造方法,Java 编译器会自动注入一个无参的默认构造方法。
  • 方法重载:支持定义多个参数列表不同的构造方法,以实现多样化的初始化策略。

代码示例:

public class Person { String name; int age; // 无参构造方法 public Person() { this.name = "未知"; this.age = 0; } // 带参构造方法(重载) public Person(String name, int age) { this.name = name; this.age = age; } public void displayInfo() { System.out.println("姓名:" + name + ",年龄:" + age); } public static void main(String[] args) { Person person1 = new Person(); person1.displayInfo(); // 输出:姓名:未知,年龄:0 Person person2 = new Person("张三", 25); person2.displayInfo(); // 输出:姓名:张三,年龄:25 } }

this 关键字的深度应用

this 关键字代表当前对象的引用,主要用于解决命名冲突及链式调用。

  1. 区分同名变量:当局部变量(如参数)与成员变量同名时,使用 this.变量名 明确指向成员变量。
  2. 调用内部方法:在类内部调用其他实例方法(通常可省略 this,但显式写出可增强可读性)。
  3. 调用其他构造方法:使用 this(参数列表) 在一个构造方法中调用同类中的另一个构造方法,必须置于构造方法的首行

代码示例:

public class Student { String name; int age; // 全参构造方法 public Student(String name, int age) { this.name = name; this.age = age; } // 无参构造方法调用全参构造方法 public Student() { this("默认姓名", 18); } public void printInfo() { this.printName(); System.out.println("年龄:" + this.age); } private void printName() { System.out.println("姓名:" + this.name); } }

访问修饰符与封装特性

访问修饰符是实现 OOP 封装(Encapsulation) 特性的核心工具,用于控制类成员的可见性,隐藏内部实现细节,暴露安全的公共接口。

Java 提供四种访问控制级别:

修饰符 同一个类 同一个包 不同包的子类 不同包的非子类 应用场景说明
private 核心数据隐藏,仅限内部访问
default 包级私有,适用于同包下的辅助类
protected 专为继承设计,允许子类扩展
public 对外暴露的公共 API 接口

封装实践示例:

public class BankAccount { // 私有属性,外部无法直接篡改 private double balance; public BankAccount(double initialBalance) { if (initialBalance >= 0) { this.balance = initialBalance; } } // 公共方法,提供受控的访问与修改途径 public void deposit(double amount) { if (amount > 0) { balance += amount; } } public double getBalance() { return balance; } }

对象的生命周期与垃圾回收(GC)

理解对象的生命周期有助于编写内存友好的 Java 程序:

  1. 创建阶段:通过 new 关键字在堆内存中分配空间,并执行构造方法初始化。
  2. 使用阶段:通过栈中的引用变量操作堆中的对象实体。
  3. 失联阶段:当对象的所有引用被置为 null 或超出作用域时,对象变为“不可达”状态。
  4. 回收阶段:JVM 的垃圾回收器(Garbage Collector)定期扫描堆内存,自动销毁不可达对象,释放内存资源。

总结与最佳实践

类与对象是构建 Java 面向对象编程体系的绝对基石。类提供了抽象的逻辑结构,而对象则是运行时的具体载体。

在实际开发中,建议遵循以下最佳实践:

  • 高内聚低耦合:合理划分类的职责,确保每个类只关注单一业务领域。
  • 严格封装:将属性声明为 private,通过 public 的 Getter/Setter 方法提供受控访问。
  • 善用构造方法:利用构造方法重载确保对象在创建时即处于合法、完整的状态。
  • 关注内存管理:避免在循环中创建大量短生命周期对象,及时释放无用引用,协助 JVM 优化垃圾回收效率。

掌握类与对象的底层机制,并进一步探索继承、多态与接口等高级 OOP 特性,将大幅提升 Java 代码的健壮性、可维护性与扩展性。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U