1, 引用变量介绍
引用变量存储的是某个对象的地址,而不是实际的内容。ABAP中的引用包括数据引用与对象引用,因此,ABAP中有数据引用变量与对象引用变量两种,而对象引用又分为类引用与接口引用。
数据引用使用CREATE DATA...创建数据对象,对象引用使用CREATE OBJECT...创建类对象,但定义都使用DATA ... TYPE REF TO...的方式来声明一个引用变量(指针)。
数据引用就是指对非对象如基本变量、结构体、内表变量的引用(类似C中的指针)。对象引用指的是对象ABAP语言中的对象进行引用(类似Java中的指针)。
创建数据引用变量的数据类型:
TYPES <t_dref> TYPE REF TO DATA.
使用上面创建出来的引用变量数据类型或者是直接通过下面的语句来创建数据引用变量:
DATA <dref> TYPE REF TO DATA.
DATA数据类型为通用类型,这里还可以使用其他通用类型或具体的类型。
另外数据引用并不是指针,只是一个地址变量,用于保存其他变量的地址,不能直接操作,只有分配给field-symbol才能使用。有以下3种使用方法:
1,自己创建对像,如CREATE DATA DREF1 TYPE T_STRUCT,这时DREF1中就放了一个T_STRUCT类型变量的地址。
2, 取得已经存在的变量内存地址,如GET REFERENCE OF <FS1>-COL2 INTO DREF2,这时DREF2中就存放了<FS1>-COL2变量的內存地址。
3,另一个数据引用变量直接赋值给他的内存地址,如DREF2 = DREF1
2, 代码
例子代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
REPORT ztest_dref. TYPES: BEGIN OF t_struct, col1 TYPE i, col2 TYPE i, END OF t_struct. DATA: dref1 TYPE REF TO data, dref2 TYPE REF TO data, dref3 TYPE REF TO data. FIELD-SYMBOLS: <fs1> TYPE t_struct, <fs2> TYPE i, <fs3> TYPE t_struct, <fs4> TYPE t_struct, <fs5> TYPE t_struct, <fs6> TYPE t_struct. CREATE DATA dref1 TYPE t_struct. WRITE '<1> 引用变量给字段符号<FS1>赋值输出'. SKIP. IF dref1 IS BOUND. ASSIGN dref1->* TO <fs1>. <fs1>-col1 = 1. <fs1>-col2 = 2 . WRITE: <fs1>-col1, <fs1>-col2. SKIP. WRITE '<2> 引用变量给字段符号<FS3>赋值输出'. SKIP. ASSIGN dref1->* TO <fs3>. WRITE: <fs3>-col1, <fs3>-col2. SKIP. WRITE ' 引用变量给字段符号赋值结束后,没有释放地址!'. SKIP. WRITE '<3> 引用变量之间是地址赋值,仍然可以输出值'. dref2 = dref1. ASSIGN dref2->* TO <fs4>. SKIP. WRITE: <fs4>-col1, <fs4>-col2. SKIP. WRITE '<4> 改变字段符号中字段值,把地址赋给引用变量DREF1后,'. SKIP. WRITE ' 引用变量DREF1通过字段符号<FS5>可以看到数据改变.'. <fs4>-col1 = 8. <fs4>-col2 = 9. GET REFERENCE OF <fs4> INTO dref1. ASSIGN dref1->* TO <fs5>. SKIP. WRITE: <fs5>-col1, <fs5>-col2. SKIP. WRITE '<5> 引用变量进行强制类型装换,若不加CASTING会输出short down.'. ASSIGN dref2->* TO <fs2> CASTING. WRITE / <fs2>. SKIP. WRITE '<6> 解除字段符号,释放内存以及数据.'. UNASSIGN <fs2>. * WRITE / <FS2>. SKIP. WRITE '当输出WRITE / <FS2>时会出现short down'. SKIP. WRITE '<7> 解除引用变量,释放内存以及数据.'. CLEAR dref2. ASSIGN dref2->* TO <fs6>. SKIP. WRITE '当输出WRITE /<FS6>-COL1,<FS6>-COL2.时会出现short down'. ENDIF. |
运行结果:
以上。
发表评论