在Java里类与对象有什么区别_Java对象模型基础说明

类是设计图纸,不占堆内存、不执行逻辑;对象是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() 该打印什么。只有对象才有数据、才能触发行为。

  • 错误写法: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 cla

ss 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 这一步——跳不过,也绕不开。