java对象模型是以类和对象为载体、由封装、继承、多态支撑的设计逻辑;类是模板、存方法区,对象是实例、存堆内存;封装强调责任边界,继承需符合is-a语义,多态依赖动态绑定。

Java 的对象模型不是一套独立的语法,而是以类和对象为载体、由封装、继承、多态共同支撑的一整套设计逻辑。它不靠魔法,靠的是清晰的结构约定和运行时行为规则。
类是模板,对象是活的实例
类本身不占堆内存,只在方法区加载一次;而每个 new 出来的对象,都在堆中分配独立空间,拥有自己的一份属性值。比如定义 Person 类后,new Person("李四", 28) 和 new Person("王五", 32) 是两个完全隔离的实体——改李四的年龄,不影响王五。
- 类名首字母大写,属性通常用 private 修饰,体现封装意图
- 构造方法负责初始化,可重载;无参构造若未显式定义,编译器会自动补上
- 对象变量(如
Person p)本身存在栈中,它只是指向堆中对象的引用
封装不只是加 private,而是定义责任边界
把字段设为 private 只是第一步。真正体现封装的是:谁该负责校验、谁该决定状态变更逻辑。例如设置年龄时,不能只允许赋值,还要判断是否合法(如 0–150);这个逻辑应放在 setter 方法里,而不是交给调用方。
- getter/setter 不是机械生成的样板,而是对外暴露的契约接口
- 内部状态可被保护,外部只能通过方法间接影响——比如“转账”操作由
Account自己完成扣款与日志记录,而非让外界直接修改余额字段 - 即使使用反射强行访问私有成员,也不代表封装失效,而是绕过了设计约定
继承建立 is-a 关系,但要慎用
子类继承父类,获得其非私有成员,但本质是承诺“我是一种父类”。比如 Dog extends Animal 合理,因为狗是一种动物;但 Car extends Engine 就违背语义——车不是引擎,而是“拥有”引擎,此时该用组合(has-a)而非继承。
- Java 只支持单继承,避免菱形继承歧义;接口则用于实现多重角色(如
Runnable+Serializable) - 子类构造中若父类有带参构造,必须第一行调用 super(...),否则编译失败
- 重写方法时,子类不能缩小父类方法的访问权限(如父类
public,子类不能改成protected)
多态让同一句代码有不同表现
多态的典型形式是父类引用指向子类对象:Animal a = new Dog(); a.speak();。运行时实际调用的是 Dog.speak(),不是 Animal.speak()。这依赖 JVM 的动态绑定机制,也是框架(如 Spring Bean 管理)能解耦的关键。
- 前提条件:继承关系 + 方法重写 + 父类引用指向子类对象
- 编译看左边(引用类型),运行看右边(实际对象类型)
- 静态方法、final 方法、私有方法不参与多态——它们在编译期就绑定好了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











