生存期与可见性

数据对象的生存期和可见性的概念是与过程相关联的,可以在过程内部或外部进行数据对象声明。过程内部声明的对象为局部对象,其他对象(包括事件块和对话模块中声明的对象)则为全局对象,此处的“全局”是相对过程而言,其作用范围是一个程序内部。

1,局部数据

局部数据是在过程中创建的类型或对象,其作用域仅为过程内部。这些数据将在过程结束时被删除,不同的局部数据类型和对象也被称作动态局部数据。

FORM add USING p1 p2.
    sum p1 + p2.
    WRITE/' int1 + int2 = 'sum.

ENDFORM.

变量sum就是动态局部对象,一旦退出该子程序,该对象就不再存在与内存中。

2,全局数据对象隐藏

如果局部数据·的名称与全局数据(在子程序外定义或声明的数据)相同,则全局数据将会被屏蔽,因为每一个过程均有自己的局域命名空间。如果出现同名的情况,则不能在过程中访问全局数据类型或对象。

REPORT z_canshu.

*Global Data

DATAint1 TYPE VALUE 1,      

      int2 TYPE 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.

DATAint1 TYPE VALUE 1,      

      int2 TYPE 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语句声明。此外,功能组中的全局数据也可以视为是组内功能模块共享的静态数据。



猜你喜欢

转载自blog.csdn.net/littlemangoyx/article/details/80220957