二维码

[基础语法] ABAP中Reference Variables和data objects

Twilight发表于 2016-10-13 10:06Twilight 最后回复于 2016-10-13 10:06 [复制链接] 2716 0

先了解两个概念:
  • reference
    翻译就是参考、引用的意思,类似于指针的概念
  • de-referenced 解引用
    引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。
    FIELD-SYMBOLS,也是相当于“解引用”,而不是指针。

引用变量(Reference Variables)存储的是某个对象的地址,而不是实际的内容。ABAP中引用变量分为数据引用变量与对象引用变量两种,其中对象引用又分为类引用与接口引用。

数据引用data references:TYPE REF TO data        通用类型是data
  1. DATA: dref TYPE REF TO i ."dref为数据引用,即数据指针,指向某个变量或常量,存储变量地址
  2. CREATE DATA dref.
  3. dref->* = 999888."解引用->*直接给数据对象dref赋值,不需要先通过分配给字段符号后再使用
复制代码

对象引用object references:TYPE REF TO object        通用类型是object
  1. CLASS cl DEFINITION.
  2.   PUBLIC SECTION.
  3.     DATA: i VALUE 1.
  4. ENDCLASS.
  5. CLASS cl IMPLEMENTATION.
  6. ENDCLASS.

  7. DATA: obj TYPE REF TO cl.        "对象引用变量
  8. CREATE OBJECT obj."创建对象

  9. DATA: oref LIKE REF TO obj. "oref为对象引用,即对象指针,指向某个对象,存储对象地址
  10. GET REFERENCE OF obj INTO oref. "获取对象地址
  11. WRITE: oref->*->i."1
复制代码

TYPE后面可以接通用类型data,但不能接object

数据引用就是指对非对象如基本变量、结构体、内表变量的引用(类似C中的指针)。对象引用指的是对象ABAP语言中的对象进行引用(类似Java中的指针)。

下面看三个案例来熟悉相关内容:
  1. *引用变量(数据引用变量/对象引用变量)
  2. TYPES: BEGIN OF t_struct,
  3.   col1 TYPE i,
  4.   col2 TYPE i,
  5.   END OF t_struct.
  6. DATA: dref1 TYPE REF TO data, "数据引用变量dref1
  7.       dref2 TYPE REF TO data. "数据引用变量dref2
  8. FIELD-SYMBOLS: <fs1> TYPE t_struct,
  9.   <fs2> TYPE i.
  10. CREATE DATA dref1 TYPE t_struct."创建数据对象dref1
  11. ASSIGN dref1->* TO <fs1>."用字段符号<fs1>指向 数据对象dref1的内容,需要使用->*(相当于C语言的解引用)表示
  12. <fs1>-col1 = 1.
  13. <fs1>-col2 = 2.
  14. dref2 = dref1.  "将数据对象dref1 赋值给 数据引用变量dref2,所以dref2就变成了数据对象,其值就是数据对象dref1的内容
  15. ASSIGN dref2->* TO <fs2> CASTING. "用字段符号<fs2>指向 数据对象dref2的内容,即指向数据对象dref1的内容
  16. *CASTING 表示数据类型强制转换,dref2->*结构是t_struct类型,赋值给<fs2>(i类型),需要强制转换类型,否则程序dump
  17. WRITE / <fs2>.
  18. GET REFERENCE OF <fs1>-col2 INTO dref2. "数据对象dref2 指向(参考、引用)<fs1>-col2的地址
  19. ASSIGN dref2->* TO <fs2>.  "用字段符号<fs2>指向 数据引用变量dref2的内容
  20. WRITE / <fs2>.
复制代码

如果数据引用是一个指向某个结构的数据对象时,可以直接通过结构对象引用(指针)来访问其成员,这与普通数据变量对象引用有所区别:
  1. TYPES:BEGIN OF strc,
  2.         comp,
  3.       END OF strc.
  4. DATA ref TYPE REF TO strc.
  5. CREATE DATA ref TYPE strc.
  6. "1、直接使用结构引用(指针)访问其成员
  7. ref->comp = 'A'.
  8. WRITE: / ref->comp.
  9. "2、先解引用结构对象,再访问其成员,这也是标准访问方式
  10. ref->*-comp = 'B'.
  11. WRITE: / ref->comp.
  12. "3、通过指针直接进行访问成员
  13. FIELD-SYMBOLS: <dref> TYPE strc.
  14. ASSIGN ref->* TO <dref>.
  15. WRITE: / <dref>-comp.
复制代码

二级指针
  1. TYPES:tpy TYPE c.
  2. DATA:c1 TYPE REF TO tpy.
  3. DATA:c2 LIKE REF TO c1."二级指针
  4. GET REFERENCE OF 'A' INTO c1.
  5. GET REFERENCE OF c1 INTO c2.
  6. WRITE: c2->*->*.  "A
复制代码

Note:ABAP中相关的数据类型
TYPE.jpg
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表