, , , , , ,

各语言面向对象底层实现方案

一、JAVA:基于类模板 + 单根类层次 + 虚方法表 vtable 1. 类是静态模板 编译期 class …

一、JAVA:基于类模板 + 单根类层次 + 虚方法表 vtable

1. 类是静态模板 编译期 class 生成 .class 字节码,类结构固定;所有实例根据类模板创建,每个实例保存实例字段,方法、静态变量、常量存在类对象(Class)中共享。

2. 单根继承:所有类隐式继承 Object,只支持单类继承、多接口实现。

3. 方法分发:虚方法表 vtable

  • 每个类加载时生成一张虚函数表,存放重写后的方法指针;
  • 调用实例方法时,通过对象头找到类的 vtable,查表执行对应方法,实现多态。

4. 属性查找:编译期确定字段偏移量,运行时直接内存偏移取值,无动态链式查找;子类字段与父类字段分离,不存在 JS 原型链那种动态逐级查找。

5. 接口:无状态,仅定义方法签名,不存储字段。

对比 JS 原型链

Java 是类先行:先有完整类定义,才能 new 对象;JS 是原型先行,对象可以直接创建再挂载原型。

二、Go:无类、无继承,采用结构体 struct + 嵌入组合 + 接口鸭子类型(组合优于继承)

Go 彻底抛弃传统 class 继承体系,没有 “类” 这个语法:

  1. struct 充当数据载体 type User struct { name string } 替代类,仅保存字段;方法通过 func (u User) Say(){} 绑定到结构体。
  2. 嵌入组合替代继承 go运行type Person struct { name string } type Student struct { Person // 匿名嵌入,复用字段与方法,语法糖,非继承 score float64 } 只是语法转发,不存在父类 / 子类层级,没有 MRO、没有 vtable。
  3. 隐式接口(鸭子类型) 只要结构体拥有接口全部方法,自动实现该接口,无需显式 implements; 接口底层靠 itab 存储类型与方法映射表实现多态分发。
  4. 无父类、无多态继承、无构造函数,靠组合复用代码。

三、PHP:基于类模板,单继承,动态属性 + 方法查找,近似 Java 但高度动态

  1. class 类模板模型(和 Java 同属基于类) 代码 class User{} 定义类模板,实例存储独有属性,类存储静态成员、方法。
  2. 单类继承、多接口,父类方法通过 parent:: 调用,继承链固定。
  3. 区别 Java:PHP 是动态弱类型
    • 实例可动态新增属性($u->test = 1);
    • 支持魔术方法 __get/__set/__call 拦截属性 / 方法访问,运行时动态处理;
  4. 多态分发:Zend 引擎为每个类维护方法哈希表,运行时查表调用,无编译期固定 vtable;
  5. 无原型链,继承是编译 / 解析阶段确定的类层级,不是对象之间的原型引用链。

语言OO 核心方案继承方式多态实现动态特性
Java静态类模板 vtable单类继承 + 多接口编译期虚方法表弱动态,字段固定
PHP动态类模板 方法哈希表单类继承 + 多接口运行时方法哈希查找强动态,支持魔术方法、动态属性
Python类 + 元类 type+MRO多继承 MRO运行时属性字典、MRO 遍历极致动态,可运行时增删类 / 实例属性
Gostruct 组合 + itab 接口无继承,仅嵌入组合接口 itab 查表中等动态,无动态字段魔术方法
JS原型链 Prototype原型委托(无类继承)逐级__proto__查找极致动态,原型可随时修改

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor