数据类型(Data Types):数据类型是创建数据对象的模板,可以在ABAP程序或者ABAP数据字典中定义,作为数据对象的属性,数据类型也可以以非独立的状态存在,数据类型不占用任何内存空间,但是对于本身的管理信息来说可能需要内存。

数据对象(Data objects):数据对象是数据类型的实例,会占用类型指定的内存空间,数据对象既可以作为命名数据对象(可以使用名字定位的数据对象,命名的数据对象是常量,变量,文本符号)被创建,也可以使用CREATE DATA作为匿名数据对象(未知的数据对象,使用引用变量或者字段符号来定位)创建。

(一)数据类型

        在ABAP程序中,区分类型和对象。类型是纯描述,除了管理信息没有其他内存的占用,对象是类型的实例,会占用内存。

ABAP类型层次结构图如下:

abap 创建 类似java的数组 abap create data_数据类型

Data types:可以进一步的分为基础数据类型,引用和复杂类型。。

Object types:用来描述ABAP面向对象中的对象,可以进一步分为类和接口。对象类型不是预定义的,他们必须在程序里定义或者在类库中。

  • 类提供了一个对象的完全描述。他们定义了对象可以包含哪些数据类型或者功能。
  • 接口的数据类型和功能可以被一个或者多个类实现。
  • 对象作为类的实例是ABAP面向对象中实际的软件对象。他们支持通过包含在数据上附加方法和事件的面向对象编程。

基础类型:是‘原子的’,不能由其他类型组成,进一步可以分成固定长度的基础类型和不定长度的类型。

  • ABAP中有10种预定义的定长数据类型,包括4种类字符的类型:c,n,d,t;5种数字类型:i,decfloat16,decfloat34,f,一种字节类型的x。就长度来说c,n,x,p是泛化(泛化类型是一个没有决定全部数据对象属性的数据类型。泛化数据类型只能用来给形参和字段符号赋予类型)的。就数字小数位来说p也是泛化的。
  • 结构类型(structured type)是一个任何基本类型引用的序列,或者是一个复杂的数据类型。结构用来把逻辑上属于一起的工作区域组织到一起。
  • ABAP中有2种预定义变长数据类型。字符类型的字符串string,字节类型的字节串xstring.

引用类型:描述了对其他对象(数据对象和类的实例)引用的数据对象,也就是引用变量。ABAP中没有预定义的引用类型,引用类型必须在ABAP程序中定义或者在ABAP数据词典里定义,引用类型可能包含一个层级,对象的这个层级代表了引用指向哪里。

复杂数据类型:由其他数据类型组成,他们是允许管理和处理一个名字下关联的数据集的语义,有两种复杂的数据类型:

  • 结构类型(structured type)是一个任意基本引用或者是一个复杂的数据类型的序列,用来把逻辑上属于一起的工作区域组织到一起。
  • 表类型:包含一个有任意数量相同数据行的序列,表类型的通过行类型进行特征化,行类型可以是任意基本数据类型,引用数据类型,或者复杂数据类型。他们也可以通过表类型特征化。

(二)数据对象

     每个数据对象有确切的数据类型,数据类型总是在程序运行时唯一的被定义,并且不能被改变,就匿名数据对象而言,这个数据类型决定了相关引用变量的动态类型。

数据对象包括如下:

  • 命名数据对象(named data object):可以使用名字定位的数据对象,命名的数据对象是常量,变量,文本符号,命名的数据对象可以存储在栈或者作为实例属性存在堆,典型的数据定义语句是DATA,命名对象通过ABAP运行时环境在上下文(程序,类,对象,过程)生命周期的开始时被创建,然后伴随着生命上下文存在,与之相对的是未命名数据对象(unnamed data object),也就是不能够使用名字来定位的数据对象,包括字面量,匿名数据对象。
  • 匿名数据对象(anonymous data object):使用语句CREATE DATA创建的未知的数据对象,使用引用变量或者字段符号来定位。匿名数据对象被存储到堆。匿名数据对象通过堆引用或者字段符号定位对象的一部分类保持存活。
  • 字面常量

内置的数据对象

      就在程序声明的数据对象而言,有一个内置的数据对象(ABAP系统字段,常量space,自己引用me,和结构screen)集合,他们总是可以在ABAP程序中被访问,另外一些语句显示的生成数据对象,然后用于特别的意图,比如sum(),cnt()。

变量和常量数据对象

       就改变数据对象的值而言,我们区分变量和常量数据对象,在运行时变量可以改变他们的值,常量总是保持他们的初始值,字面量和文本符号总是常量。

静态和动态数据对象。

       静态数据对象,他们的所有的技术属性需要在声明的时候被定义,动态数据对象,他需要的内存或者空间只有在运行时才会被定义,字符串和内表是动态的数据对象。

在声明之后,字符串的长度等于0,然后再运行时依赖分配到它的内容改变,在声明之后,内表不包含任何行,任意数量的行都是可能的,当内表被填充的时候行在运行时被动态填充,结构包含动态的组件,所以也是动态数据对象。

扁平和深层的数据对象

       所有的静态数据对象期望引用变量是扁平的,他们的内容关联到实际的工作数据,动态数据对象和引用变量是深层的,他们包含对实际内容的引用。

结构不包含任何深层的组件,是扁平结构;包含至少一个深层 组件,是深层结构 。