1.1 什么是Java对象
在Java世界里,对象就像现实生活中的具体物品。想象你手中握着的手机——它有颜色、重量、品牌这些属性,还能打电话、发消息这些行为。Java对象也是这样的存在,它是类在内存中的具体实例。
每个对象都拥有自己独立的内存空间,存储着特定的状态信息。比如创建两个Student对象,虽然它们都来自同一个Student类,但一个可能是张三,另一个可能是李四,各自保存着不同的姓名、年龄和成绩数据。
我记得刚开始学Java时,老师用"汽车设计图"和"实际生产的汽车"来比喻类和对象。设计图定义了汽车应有的结构和功能,而真正能开上路的必须是按照设计图制造出来的具体汽车。这个比喻让我瞬间理解了对象的意义。
1.2 对象与类的区别与联系
类和对象的关系,某种程度上像模具与产品的对应。类定义了对象的蓝图,对象则是根据这个蓝图创建的具体实体。
类是一个抽象概念,它描述了某一类事物共有的特征和行为。比如"人"这个类,定义了所有人都有姓名、年龄,都能走路、说话。但"人"本身不能直接使用,必须创建具体的对象,比如"张三"这个人才是真正可操作的实体。
从技术角度看,类在编译后以.class文件形式存在,而对象在程序运行时被创建在堆内存中。类只加载一次,却可以创建无数个对象实例。这种关系设计得非常精妙,既保证了代码复用,又支持了对象的个性化。
1.3 对象创建的基本流程
当你在代码中写下new Student()
的那一刻,Java虚拟机就开始执行一套精密的创建流程。
首先是类加载检查。如果Student类还没有被加载,JVM会通过类加载器找到对应的.class文件,将其加载到内存中。接着进行内存分配,在堆中划出一块区域来存放这个新对象。这块内存的大小在类加载完成后就已经确定下来了。
然后进行内存空间的初始化,将所有实例变量设置默认值。数字类型设为0,布尔类型设为false,引用类型设为null。这步确保了对象处于一个确定的状态。
执行初始化代码块和构造方法,按照代码顺序进行。构造方法就像是对象的"出生仪式",完成最后的定制化设置。最后,在栈内存中创建引用变量,指向堆中的对象实例。
整个创建过程看似简单,背后却蕴含着Java内存管理的智慧。理解这个过程,对后续深入学习内存优化和性能调优很有帮助。 Student student = new Student();
public class DatabaseConnection {
private static DatabaseConnection instance;
private DatabaseConnection() {
// 私有构造方法防止外部实例化
}
public static DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
}
public class ObjectPool
private final Queue<T> pool;
private final Supplier<T> creator;
public ObjectPool(int size, Supplier<T> creator) {
this.pool = new LinkedList<>();
this.creator = creator;
for (int i = 0; i < size; i++) {
pool.offer(creator.get());
}
}
public T borrowObject() {
return pool.isEmpty() ? creator.get() : pool.poll();
}
public void returnObject(T object) {
pool.offer(object);
}
}
public class DataManager {
private static final Map<String, Object> CACHE = new HashMap<>();
public void addToCache(String key, Object value) {
CACHE.put(key, value); // 如果不主动移除,这些对象会一直存在
}
}