类是不占内存的设计模板,描述属性和方法;对象是堆中独立内存实例,每个对象字段值互不影响。

类是模板,对象是根据这个模板在内存里造出来的具体东西;没类就造不出对象,但一个类能造出无数个互不干扰的对象。
类是什么:不占内存的“设计图纸”
类只是代码里的定义,不分配内存,也不执行任何行为。它描述了一类事物该有什么属性(比如 String name)、能做什么事(比如 void speak())。你写完 class Person { ... },JVM 还没动它——直到第一次 new Person() 才加载进方法区。
- 类名必须大驼峰(
Person,不能是person) - 成员变量默认值不是
null就是0或false,但这是初始化阶段的事,类本身不存值 - 静态成员(
static字段或方法)属于类自身,所有对象共享一份,可直接用Person.getCount()调用,无需对象
对象是什么:堆里的一块独立内存空间
每次 new Person(),JVM 就在堆中划一块新区域,填入初始值、跑构造方法、返回一个引用——这个引用变量(比如 p)指向那块内存,但不是内存本身。
-
Person p1 = new Person(); Person p2 = new Person();→ 两个完全独立的对象,改p1.name不影响p2.name - 方法代码只存一份(在方法区),所有对象共用;但每个对象的字段值各自存自己的堆空间里
- 如果写
Person p3 = p1;,只是让p3指向同一块堆内存,不是复制对象
实例化时最容易踩的坑
看似简单的一行 new Person(),背后容易出三类问题:
立即学习“Java免费学习笔记(深入)”;
- 空指针异常(
NullPointerException):声明了变量(Person p;)但没new,就直接调p.speak() - 构造方法不匹配:类只定义了带参构造(
Person(String n)),却写new Person()→ 编译报错constructor Person() is undefined - 误以为对象复制了:写
Person p2 = p1;后修改p2.name,结果p1.name也变了——因为根本没创建新对象,只是多了一个引用
真正关键的是分清「类定义结构」和「对象承载状态」这两层:类决定你能写什么字段、调什么方法;对象决定这些字段此刻存的是什么值——而这个值,只对它自己生效。










