Java的基础:对象
对象(Object)详解
1. 定义
是什么?
对象是面向对象编程(OOP)的基本单元,是类的具体实例。它通过类定义的模板创建,拥有类中声明的属性(数据)和行为(方法)。
- 类与对象的关系:类是蓝图,对象是实例(如“汽车设计图”是类,“某辆红色跑车”是对象)。
- 核心特性:
- 唯一性:每个对象在内存中独立存在,拥有唯一的地址。
- 状态:通过属性值描述当前状态(如
name="张三", age=20
)。 - 行为:通过方法定义可执行的操作(如
study()
,run()
)。
为什么需要对象?
- 模拟现实实体:将现实中的事物映射为代码中的数据结构(如学生、订单、商品)。
- 封装数据与操作:将属性和方法绑定,隐藏实现细节,暴露安全接口。
- 动态交互:通过对象之间的消息传递实现复杂逻辑(如用户下单、库存扣减)。
2. 使用场景与实现方式
适用场景
- 实例化具体实体:如创建用户、订单、商品等实际数据。
- 动态行为交互:如调用对象的
login()
方法处理登录逻辑。 - 模块化开发:通过对象封装功能模块(如购物车、支付网关)。
如何创建对象?
// 1. 定义类
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void study() {
System.out.println(name + "在学习");
}
}
// 2. 实例化对象
Student student = new Student("张三", 20); // 调用构造方法创建对象
student.study(); // 调用对象方法
注意事项
- 构造方法调用:必须通过
new
关键字调用构造方法创建对象。 - 内存管理:对象存储在堆内存中,垃圾回收器(GC)自动回收无引用对象。
- 对象引用:变量(如
student
)是对象的引用(指针),而非对象本身。
3. 作用
- 封装数据与行为:将属性和方法绑定,形成独立的功能单元。
- 动态交互:通过对象方法调用实现功能逻辑(如
user.login()
)。 - 支持多态:父类引用指向子类对象,实现运行时动态绑定。
- 模块化设计:通过对象组合构建复杂系统(如电商系统中的订单、库存、支付对象)。
4. 代码案例与注解
场景1:基础对象创建与使用
/**
* 类:汽车
*/
class Car {
// 属性
private String brand;
private int speed;
// 构造方法
public Car(String brand, int speed) {
this.brand = brand;
this.speed = speed;
}
// 方法:加速
public void accelerate(int increment) {
speed += increment;
System.out.println(brand + "加速至" + speed + "km/h");
}
// Getter方法
public int getSpeed() {
return speed;
}
}
public class Main {
public static void main(String[] args) {
// 实例化对象
Car myCar = new Car("Tesla", 60);
myCar.accelerate(20); // 输出:Tesla加速至80km/h
System.out.println("当前速度:" + myCar.getSpeed()); // 输出:80
}
}
代码注解
-
对象创建:
Car myCar = new Car("Tesla", 60);
new Car(...)
调用构造方法,在堆内存中创建对象。myCar
是对象的引用,指向堆内存中的实例。
-
方法调用:
myCar.accelerate(20);
- 通过对象引用调用实例方法,修改对象状态(
speed
)。
- 通过对象引用调用实例方法,修改对象状态(
场景2:对象引用与内存管理
public class Main {
public static void main(String[] args) {
// 对象引用示例
Car car1 = new Car("BMW", 100);
Car car2 = car1; // car2 和 car1 指向同一对象
car2.accelerate(50); // 修改的是同一对象
System.out.println(car1.getSpeed()); // 输出:150(car1和car2引用同一对象)
}
}
注释:
- 引用传递:
car2 = car1
使两个引用指向同一对象,修改任一引用会影响同一对象。 - 内存泄漏风险:若对象被多个引用持有,需确保不再使用时解除引用以便 GC 回收。
场景3:对象数组
public class Main {
public static void main(String[] args) {
// 创建对象数组
Car[] garage = new Car[3];
garage[0] = new Car("Audi", 80);
garage[1] = new Car("Ford", 70);
garage[2] = new Car("Toyota", 90);
// 遍历调用方法
for (Car car : garage) {
car.accelerate(10);
}
}
}
输出:
Audi加速至90km/h
Ford加速至80km/h
Toyota加速至100km/h
5. 高级应用
场景:不可变对象(线程安全)
// 不可变类:所有属性私有 + 无Setter方法 + final修饰
public final class ImmutableStudent {
private final String name;
private final int age;
public ImmutableStudent(String name, int age) {
this.name = name;
this.age = age;
}
// 只有Getter,无Setter
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
ImmutableStudent student = new ImmutableStudent("李四", 22);
// student.setName("王五"); // 编译错误(无Setter方法)
}
}
注释:
- 不可变对象:对象一旦创建,状态不可修改(如
String
类)。 - 适用场景:多线程安全、缓存键值。
6. 注意事项
-
空指针异常(NullPointerException):
- 调用未初始化对象的方法会导致崩溃:
Car car = null; car.accelerate(10); // 抛出 NullPointerException
- 解决:始终确保对象已初始化。
-
对象生命周期管理:
- 避免长时间持有无用对象引用,防止内存泄漏。
- 及时解除引用(如
object = null
)辅助 GC 回收。
-
深浅拷贝问题:
- 对象赋值是引用拷贝(浅拷贝),需重写
clone()
实现深拷贝。
- 对象赋值是引用拷贝(浅拷贝),需重写
-
构造方法设计:
- 确保对象创建后处于合法状态(如年龄不为负数)。
总结
- 对象是面向对象编程的基石:通过实例化类实现具体功能。
- 核心关系:
概念 对象 类 角色 实例 模板 内存分配 堆内存 方法区(类元数据) 数量 一个类可创建多个对象 唯一 - 设计原则:
- 高内聚:对象内部逻辑紧密相关。
- 低耦合:对象之间依赖最小化。
关键记忆点
- 对象 = 属性(状态) + 方法(行为)。
new
关键字触发构造方法,分配堆内存。- 引用变量存储对象地址,而非对象本身。