类是设计图纸,不占堆内存、不执行逻辑;对象是new出的实例,存于堆中且拥有独立属性副本。类仅定义结构,对象才具备状态与行为,static成员除外。

类是模板,对象是按模板造出来的具体东西——不new出来就只是纸面设计,不会占用内存、也不能调用方法。
类(Class)到底是什么
类是Java里的“设计图纸”,它不干实事,只声明有哪些属性(比如 String name)、哪些方法(比如 void eat()),还规定了这些成员的访问权限(public / private)。它本身不占堆内存,也不会执行任何逻辑。
- 类定义后,编译生成
.class文件,被JVM加载进方法区(元空间) - 类中定义的
static变量属于类,随类加载而存在;普通成员变量不属于类,只属于对象 - 没有显式写构造方法时,编译器会悄悄加一个无参
public 类名() {},但一旦你写了任意构造方法,这个默认的就没了
对象(Object)是怎么来的
对象是运行时通过 new 操作符实实在在创建出来的实例,它在堆内存里占据一块独立空间,每个对象都有自己的属性副本(比如两个 Person 对象,name 值互不影响)。
- 创建三步缺一不可:
Person p;(声明)→new Person()(实例化)→ 构造方法执行(初始化) -
p本身不是对象,而是指向堆中那个对象的引用(类似“遥控器”),可以赋值给其他引用变量,多个引用可指向同一对象 - 对象生命周期从
new开始,到没有任何引用可达、被GC回收为止
为什么不能直接用类调属性或方法
因为类没有“状态”——它没存任何具体的 name 值,也没法决定 eat() 该打印什么。只有对象才有数据、才能触发行为。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
Person.name = "张三";→ 编译报错:non-static variable name cannot be referenced from a static context - 正确路径:必须先有对象,再用点号访问:
Person p = new Person(); p.name = "张三"; p.eat(); - 例外只有
static成员:它们属于类本身,可用Person.count直接访问(但这是特例,不是面向对象的常规用法)
public class Person {
public String name; // 实例变量,每个对象一份
public static int count = 0; // 类变量,所有对象共享
public void sayHello() {
System.out.println("Hello, I'm " + name);
}
public static void showCount() {
System.out.println("Total: " + count);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "Alice";
p1.sayHello(); // ✅ OK:对象调实例方法
Person p2 = new Person();
p2.name = "Bob";
p2.sayHello(); // ✅ 输出不同内容,互不干扰
Person.showCount(); // ✅ OK:静态方法直接用类名调
// Person.sayHello(); // ❌ 编译错误:非静态方法不能这样调
}
}
最容易被忽略的一点:很多人以为写了类就等于有了可用的东西,其实类只是语法存在;真正干活、存数据、响应调用的,永远是对象。哪怕只建一个对象,也必须走 new 这一步——跳不过,也绕不开。










