类是模板,对象是用模板创建的具体实例;类定义结构与行为,不占实例内存,仅加载时存结构信息;对象通过new在堆中分配独立内存,拥有私有字段副本,方法代码被共享;static字段属类、被所有对象共享;构造方法无返回类型、名同类名;封装要求字段私有、通过getter/setter受控访问。

类是模板,对象是用这个模板造出来的具体东西——这是最直白、也最不容易出错的理解方式。
比如你写 public class Car { ... },这行代码没创建任何车,它只是画了一张图纸;而 Car myCar = new Car(); 这一句才真正在内存里“造出一辆车”,这辆车有自己独立的 color、brand、price,改它的属性不会影响别的 Car 对象。
类不占内存,对象才真正占用内存
你编译完一个 Car 类,JVM 加载它时只加载类结构(方法字节码、字段描述、常量池等),不分配实例空间。只有执行 new Car() 时,JVM 才在堆(heap)中划出一块内存,存放该对象的字段值和对象头(如锁标记、GC 分代信息)。
- 多个对象共用同一份方法代码,但每个对象的成员变量(非
static)都是独立副本 -
static字段属于类本身,所有对象共享一份,修改它会影响所有对象 - 没被引用的对象(如
myCar = null;后又无其他引用)会被 GC 回收,而类本身只要被加载且未被卸载,就一直存在
对象必须通过 new 创建,但类不能直接使用
你不能写 Car.start();(除非 start() 是 static 方法),因为行为要作用在某个具体个体上。类只是定义“能做什么”,对象才是“正在做什么”的执行主体。
立即学习“Java免费学习笔记(深入)”;
- 构造方法不是普通方法:没有返回类型(连
void都不能写),名字必须和类名完全一致 - 如果写了带参构造(如
public Car(String color)),Java 就不再自动提供无参构造——想用new Car()就得手动补上public Car() {} - 用
this区分参数和成员变量:this.color = color;,否则同名时局部变量会覆盖成员变量
封装让对象真正“独立”,而不是暴露一堆 public 字段
初学者常把字段全写成 public String brand;,结果外部代码直接 myCar.brand = "拖拉机";,破坏业务规则且无法追踪赋值来源。正确的做法是私有化 + 提供受控访问:
public class Car {
private String brand;
<pre class='brush:java;toolbar:false;'>public String getBrand() {
return brand;
}
public void setBrand(String brand) {
if (brand != null && !brand.trim().isEmpty()) {
this.brand = brand;
}
}}
-
private字段 +publicgetter/setter 是封装的最小可行单元 - setter 中可加入校验逻辑(如品牌不能为空、价格不能为负),getter 可做懒加载或格式转换
- 一旦字段暴露为
public,后续想加校验或日志,所有调用方都得改——这就是“容易踩的坑”里最痛的一个
类和对象的边界,本质是抽象与具体的分界线。很多人写到一半发现逻辑混乱,往往是因为在类里混进了本该属于对象状态的临时数据,或者把本该由多个对象各自维护的状态强行抽成 static 共享——这种设计一旦并发或扩展,问题立刻浮出水面。










