一、JAVA:基于类模板 + 单根类层次 + 虚方法表 vtable
1. 类是静态模板 编译期 class 生成 .class 字节码,类结构固定;所有实例根据类模板创建,每个实例保存实例字段,方法、静态变量、常量存在类对象(Class)中共享。
2. 单根继承:所有类隐式继承 Object,只支持单类继承、多接口实现。
3. 方法分发:虚方法表 vtable
- 每个类加载时生成一张虚函数表,存放重写后的方法指针;
- 调用实例方法时,通过对象头找到类的 vtable,查表执行对应方法,实现多态。
4. 属性查找:编译期确定字段偏移量,运行时直接内存偏移取值,无动态链式查找;子类字段与父类字段分离,不存在 JS 原型链那种动态逐级查找。
5. 接口:无状态,仅定义方法签名,不存储字段。
对比 JS 原型链
Java 是类先行:先有完整类定义,才能 new 对象;JS 是原型先行,对象可以直接创建再挂载原型。
二、Go:无类、无继承,采用结构体 struct + 嵌入组合 + 接口鸭子类型(组合优于继承)
Go 彻底抛弃传统 class 继承体系,没有 “类” 这个语法:
- struct 充当数据载体
type User struct { name string }替代类,仅保存字段;方法通过func (u User) Say(){}绑定到结构体。 - 嵌入组合替代继承 go运行
type Person struct { name string } type Student struct { Person // 匿名嵌入,复用字段与方法,语法糖,非继承 score float64 }只是语法转发,不存在父类 / 子类层级,没有 MRO、没有 vtable。 - 隐式接口(鸭子类型) 只要结构体拥有接口全部方法,自动实现该接口,无需显式
implements; 接口底层靠itab存储类型与方法映射表实现多态分发。 - 无父类、无多态继承、无构造函数,靠组合复用代码。
三、PHP:基于类模板,单继承,动态属性 + 方法查找,近似 Java 但高度动态
- class 类模板模型(和 Java 同属基于类) 代码
class User{}定义类模板,实例存储独有属性,类存储静态成员、方法。 - 单类继承、多接口,父类方法通过
parent::调用,继承链固定。 - 区别 Java:PHP 是动态弱类型
- 实例可动态新增属性(
$u->test = 1); - 支持魔术方法
__get/__set/__call拦截属性 / 方法访问,运行时动态处理;
- 实例可动态新增属性(
- 多态分发:Zend 引擎为每个类维护方法哈希表,运行时查表调用,无编译期固定 vtable;
- 无原型链,继承是编译 / 解析阶段确定的类层级,不是对象之间的原型引用链。
| 语言 | OO 核心方案 | 继承方式 | 多态实现 | 动态特性 |
|---|---|---|---|---|
| Java | 静态类模板 vtable | 单类继承 + 多接口 | 编译期虚方法表 | 弱动态,字段固定 |
| PHP | 动态类模板 方法哈希表 | 单类继承 + 多接口 | 运行时方法哈希查找 | 强动态,支持魔术方法、动态属性 |
| Python | 类 + 元类 type+MRO | 多继承 MRO | 运行时属性字典、MRO 遍历 | 极致动态,可运行时增删类 / 实例属性 |
| Go | struct 组合 + itab 接口 | 无继承,仅嵌入组合 | 接口 itab 查表 | 中等动态,无动态字段魔术方法 |
| JS | 原型链 Prototype | 原型委托(无类继承) | 逐级__proto__查找 | 极致动态,原型可随时修改 |




