java - 在 Java/Objective C 中,类/实例对象实际上如何从内存的 Text/Method Segment 访问方法?

标签 java objective-c object memory

据我了解(如果我错了,请纠正我),在C/Objective C中,类的方法存储在内存的代码/文本段中。在Java中,方法存储在方法区(相当于代码/测试段)。方法可以在编译时分配。我还相信每个对象,无论是类还是实例,并不是每次都用方法代码实例化的。相反,方法在代码/文本段中创建一次。然后,位于堆段中的对象实例必须以某种方式访问​​/关联到这些方法。

1) 对象是否将方法的内存地址存储在其数据中?

2)关于继承,对象是否以某种方式(通过“extends”等关键字)也存储其父类(super class)方法的内存地址?

最佳答案

问题 1 和问题 2 都试图为我指明最初的方向:类/实例对象如何实际访问 Java/Objective C 中内存的文本/方法段中的方法?

不幸的是,这两个问题实际上都朝着错误的方向发展。这是我现在所知道的:

a) 对象只是组合在一起的变量(属性) block 。如果将对象分解为多个部分,则对象只是原始变量的集合,它们以特定方式分组在一起(因此,数组样式或自定义类样式)。他们无论如何都不会携带有关其方法的任何信息。对于大多数基于类的语言(例如 Java、Objective-C 或 Swift)都是如此。然而,对于像 Javascript 这样基于原型(prototype)的语言,情况就大不相同了。

b) 方法实际上是与对象分离的实体。方法与函数一样,驻留在代码区中,并且只是二进制指令 block 。每当您调用一个方法时,您实际上是通过该方法的类似指针的内存地址访问该二进制指令 block 。该内存地址通过函数/方法标识符(名称)公开。所有方法就像函数一样,其中大多数实际上与全局函数共享相同的作用域。每个函数/方法名称(对于编译器而言)都是唯一的,并且代表一个非常具体的内存地址。

因此,当您通过调用方法名称来调用方法时,程序可以访问由函数标识符表示的特定位置。因此,函数在代码区中创建一次。与常规函数不同,方法必须需要特定类的实例才能工作。这基本上就是方法的全部要点 - 一个专门的函数,需要来自对象的一组特定数据来执行专门的任务。因此,每当使用一个方法时,就需要一个对象实例来伴随它。编译器只是帮助您自动将对象的指针作为参数传递给特定类的方法,并将其存储在局部变量中,例如“self”或“this”。换句话说,对象与其方法之间的唯一联系是编译器自动创建一个对象指针作为方法的隐藏参数;并要求您实例化一个现有对象来满足该隐藏参数并允许调用这些方法。

关于java - 在 Java/Objective C 中,类/实例对象实际上如何从内存的 Text/Method Segment 访问方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29387227/

相关文章:

java - EJML获取矩阵特征向量的实值

java - 在 java.net.URL 类中为 DNS 查找提供自定义实现

ios - Storyboard - 如何在没有动画和显示屏幕的情况下自动执行转场

iOS Google map sdk 方法 "idleAtCameraPosition"未被调用

javascript - 如何找到对象中深层嵌套的唯一键的路径并相应地分配子对象?

java - 运行时错误: running java class file

java - 准备好的语句返回错误值

ios - UICollectionViewController : [UICollectionViewController loadView] loaded the "identifier" nib but didn't get a UICollectionView

JavaScript 对象和方法,但 getName 不是函数

java - 碰撞检测和 react java