数据对象的生存期和可见性的概念是与过程相关联的,可以在过程内部或外部进行数据对象声明。过程内部声明的对象为局部对象,其他对象(包括事件块和对话模块中声明的对象)则为全局对象,此处的“全局”是相对过程而言,其作用范围是一个程序内部。
1,局部数据
局部数据是在过程中创建的类型或对象,其作用域仅为过程内部。这些数据将在过程结束时被删除,不同的局部数据类型和对象也被称作动态局部数据。
FORM add USING p1 p2.
sum = p1 + p2.
WRITE: /' int1 + int2 = ', sum.
ENDFORM.
变量sum就是动态局部对象,一旦退出该子程序,该对象就不再存在与内存中。
2,全局数据对象隐藏
如果局部数据·的名称与全局数据(在子程序外定义或声明的数据)相同,则全局数据将会被屏蔽,因为每一个过程均有自己的局域命名空间。如果出现同名的情况,则不能在过程中访问全局数据类型或对象。
REPORT z_canshu.
*Global Data
DATA: int1 TYPE i VALUE 1,
int2 TYPE i VALUE 2,
sum TYPE i VALUE 0.
PERFORM add USING int1 int2.
WRITE: /'Outside Sub : sum =', sum.
FORM add USING p1 p2.
*Local Data in the Subroutine
DATA sum TYPE i.
sum = p1 + p2.
WRITE: /'Inside Sub : sum =', sum.
ENDFORM.
变量名称sum在主程序和子程序中两次声明,因而在子程序内部全局对象被隐藏,程序操作是局部对象,直接退出子程序后全局对象恢复有效。
3,静态数据对象
如果数据对象只在一个子程序内部出现,但在子程序调用过程结束之后,还需要继续保留局部数据对象的值,可以使用STATICS语句代替DATA语句在子程序中进行对象声明。STATICS语句是DATA语句的变体,语法与DATA语句相似:
STATICS s [length] type [value] [decimals].
直接定义静态的结构体数据对象的语法:
STATICS: BEGIN OF fstring,
<component declaration>,
...
END OF fstring.
静态数据对象的意义在于,如果在程序中多次调用某一子程序,静态变量不会像动态局部数据对象那样重新分配内存空间,系统将保留静态局部数据对象的值,而且可在下次调用同一子程序时在当前值的基础上继续进行操作。但是不能从过程外部,即主程序中访问该数据对象。可以这样理解:静态数据对象是在全局范围中定义,但仅在定义它的子程序中局部可见的数据对象。
REPORT z_jingtai.
DATA: int1 TYPE i VALUE 1,
int2 TYPE i VALUE 2.PERFORM add USING int1.
PERFORM add USING int2.
FORM add USING p1.
*Static Local Data Objects
STATICS sum TYPE i.
sum = sum + p1.
WRITE: /'sum =' , sum.
ENDFORM.
如果STATICS关键字换成DATA,则每一次调用改子程序时,sum的值将被初始化(清空)。除子程序外,ABAP类中的静态数据对象使用CLASS-DATA语句声明。此外,功能组中的全局数据也可以视为是组内功能模块共享的静态数据。