类是描述一类事物的蓝图,对象是类的具体实例;类不占用运行时内存,对象在堆中独立存储属性;可执行代码必须在方法或初始化块内;非静态方法只能通过对象调用;static 成员被所有对象共享;类加载不等于对象创建。

类是模板,对象是实例
类不是数据,也不是运行时存在的东西,它只是描述“一类事物该长什么样、能做什么”的蓝图。比如 Car 类定义了有 color、speed 属性,和 start()、accelerate() 方法;而 new Car("red") 才真正创建一个内存中的具体汽车对象——这个对象有自己独立的 color 值、自己的 speed 值。
类里不能直接写执行逻辑,对象才能调用方法
你不能在类体里直接写 System.out.println("hello");,否则编译报错:illegal start of expression。所有可执行代码必须包在方法(如 main()、start())或初始化块里。只有对象能触发这些行为:
Car myCar = new Car("blue");
myCar.start(); // ✅ 合法:对象调用实例方法
Car.start(); // ❌ 编译错误:非静态方法不能用类名直接调用
除非方法被声明为 static,否则它属于对象,不属类本身。
同一个类可以产生多个互不干扰的对象
每个对象在堆内存中独占一份实例变量空间。改一个对象的属性,不影响另一个:
立即学习“Java免费学习笔记(深入)”;
Car a = new Car("black"); a.speed = 60;Car b = new Car("white"); b.speed = 45;- 此时
a.speed == 60,b.speed == 45,两者完全独立 - 但若类里定义了
static int count = 0;,那么a.count和b.count共享同一份值
类加载和对象创建是两个不同阶段
JVM 加载 Car.class 文件时,只解析结构、分配静态变量空间、执行 static 块——这时还没有任何 Car 对象。直到执行 new Car(),才触发构造器、分配堆内存、初始化实例字段。这意味着:
- 类可以存在而没有任何对象(比如工具类
Math,没人new Math()) - 对象一定依赖某个已加载的类,但类不需要靠对象来存在
- 反射中
Class.forName("Car")只加载类,不创建对象
别把 “类被使用” 和 “对象被创建” 混为一谈——这是初学者最常卡住的地方。










