类是模板,对象是实例:类定义结构不占内存,对象创建时分配堆内存并存储真实数据;类不能直接访问非静态成员,必须通过对象调用。

类是模板,对象是实例——关系一句话说清
类和对象的关系不是“包含”或“继承”,而是“定义与生成”的关系:类不占内存,只是代码里的一段描述;对象一创建就分配堆内存,有真实数据。就像用同一张图纸(class Car)造出十辆不同颜色、不同里程的车(new Car()),每辆车都是独立个体,互不影响。
为什么不能直接用类调用属性或方法?
因为类本身没有状态——它没存任何具体的name、age值。你写Person.name会编译报错,除非这个name被声明为static。真正能访问属性和方法的,永远是对象:person1.name、person2.speak()。常见错误就是把类当对象用,比如误写Car.start()(没加new,也没声明为static),JVM会直接拒绝。
对象创建时发生了什么?内存里怎么分布的?
执行Person p = new Person();这行代码时,JVM会做三件事:
- 先加载
Person类信息到方法区(只加载一次) - 在堆中开辟一块空间,给所有成员变量设默认值(
int→0,String→null) - 把堆中这块地址赋给栈里的变量
p,此时p才真正“指向”一个对象
后续你写p.name = "张三",改的是堆里那块内存的数据,不是类定义本身。
立即学习“Java免费学习笔记(深入)”;
容易被忽略的关键细节
很多人以为“类里写了public void eat()”,就能直接Person.eat()调用——不行,除非加static。而一旦加了static,这个方法就脱离对象上下文,无法访问this.name这类非静态成员。这是初学者最容易混淆的边界:静态属于类,非静态属于对象。别指望一个模板自己吃饭,得先造出一个能吃饭的实体才行。









