属性( Attributes) :对象的属性及特征方法( Method ):定义对象的行为
从对象属性和方法是属于类还是属于对象的实例,可以区分为静态属性(static attributes) / 静态方法(static methods),实例属性(instance attributes) / 实例方法(instance methods)
1.静态属性和方法
静态属性
通过 CLASS-DATA 关键字进行声明,通过类名以及 =>
符号进行调用
静态方法
通过 CLASS-METHODS 关键字进行声明,通过类名以及 =>
符号进行调用
静态属性和方法属于类本身,在各个对象实例之间是共享的,通过类名来访问,调用的时候,不需要创建对象的实例
例1
REPORT z437_test_2025.
* 静态属性和方法的定义
CLASS lcl_math DEFINITION.
PUBLIC SECTION.
TYPES: ty_double TYPE p LENGTH 10 DECIMALS 2.
CLASS-DATA pi TYPE p LENGTH 10 DECIMALS 7 VALUE '3.1415926'.
CLASS-METHODS: pow IMPORTING x TYPE ty_double
y TYPE ty_double
RETURNING VALUE(pow_value) TYPE ty_double.
ENDCLASS.
CLASS lcl_math IMPLEMENTATION.
METHOD pow.
pow_value = x ** y.
ENDMETHOD.
ENDCLASS.
* 静态属性和方法的访问
START-OF-SELECTION.
DATA: result TYPE p DECIMALS 2.
CALL METHOD lcl_math=>pow
EXPORTING
x = 25
y = 3
RECEIVING
pow_value = result.
* result = lcl_math=>pow( x = 25 y = 3 ).
WRITE: / 'pi = ', lcl_math=>pi LEFT-JUSTIFIED,
/ '25 ** 3 = ', result LEFT-JUSTIFIED.
输出结果:
在ABAP中,类中定义方法,返回方法的结果值需要使用RETURNING VALUE(xxx)
方法定义 IMPORTING 调用时对应 EXPORTING
方法定义 RETURNING 调用时对应 RECEIVING
2.实例属性和方法
实例属性
实例属性属于对象的实例(object instance),通过DATA关键字进行声明,通过对象变量以及 ->
符号进行调用
实例中的属性是相互独立的
实例方法
实例方法属于对象的实例(object instance),通过METHODS关键字进行声明,通过对象变量以及 ->
符号进行调用
例1
REPORT z437_test_2025.
* 实例属性和方法的定义
CLASS lcl_student DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING sid TYPE string
name TYPE string
age TYPE int2
current_class TYPE string.
METHODS: set_age IMPORTING new_age TYPE int2,
set_class IMPORTING new_class TYPE string,
to_string RETURNING VALUE(rv) TYPE string.
PRIVATE SECTION.
DATA: sid TYPE string,
name TYPE string,
age TYPE int2,
current_class TYPE string.
ENDCLASS. " lcl_student DEFINITION
CLASS lcl_student IMPLEMENTATION.
METHOD constructor.
me->sid = sid.
me->name = name.
me->age = age.
me->current_class = current_class.
ENDMETHOD. " constructor
METHOD set_age.
me->age = new_age.
ENDMETHOD. " set_age
METHOD set_class.
me->current_class = new_class.
ENDMETHOD. " set_class
METHOD to_string.
DATA: result TYPE string.
DATA: age_str TYPE string.
age_str = me->age.
CONCATENATE '<Student: (ID:' me->sid ',Name:' me->name ',Age:' age_str',Class:' me->current_class ')>'
INTO result.
rv = result.
ENDMETHOD.
ENDCLASS. " lcl_student IMPLEMENTATION
* 实例属性和方法的访问
START-OF-SELECTION.
DATA: stu_info TYPE string.
" 定义引用类型的变量
DATA: s1 TYPE REF TO lcl_student.
" 创建对象的实例
" 在本例中,构造函数有4个参数,方法定义时关键字为IMPORTING,调用时对应EXPORTING关键字
CREATE OBJECT s1 EXPORTING sid = '001'
name = 'Andy'
age = 18
current_class = '卓越21班'.
" 调用对象的属性和方法
CALL METHOD s1->set_age
EXPORTING
new_age = 20.
* s1->set_age( 20 ).
CALL METHOD s1->set_class
EXPORTING
new_class = '卓越A班'.
* s1->set_class( '卓越A班' ).
stu_info = s1->to_string( ).
WRITE: / stu_info.
输出结果:
构造方法(constructor)是一类特殊的方法,在创建对象实例时,构造方法自动运行
例2
REPORT z437_test_2025.
CLASS lcl_demo DEFINITION.
PUBLIC SECTION.
" 实例属性
DATA: gv_first_name TYPE c LENGTH 100 VALUE 'Instance Class'.
" 静态属性
CLASS-DATA: gv_last_name TYPE c LENGTH 100 VALUE 'Static Class'.
" 实例方法
METHODS: write_instance.
" 静态方法
CLASS-METHODS: write_static.
ENDCLASS.
CLASS lcl_demo IMPLEMENTATION.
METHOD write_instance.
WRITE: / '实例属性', gv_first_name.
WRITE: / '静态属性', gv_last_name.
ULINE.
ENDMETHOD.
METHOD write_static.
WRITE: / '静态方法里的静态属性',gv_last_name.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
" 定义变量
DATA: lo_f_1 TYPE REF TO lcl_demo,
lo_f_2 TYPE REF TO lcl_demo.
" 实例化
CREATE OBJECT lo_f_1.
CREATE OBJECT lo_f_2.
" 实例中的属性是相互独立的
lo_f_1->gv_first_name = '1'.
lo_f_2->gv_first_name = '2'.
" 访问实例方法
lo_f_1->write_instance( ).
lo_f_2->write_instance( ).
WRITE: / '访问静态属性', lcl_demo=>gv_last_name.
ULINE.
" 访问静态方法
lcl_demo=>write_static( ).
输出结果:
总结
① 静态属性和方法与类相关,实例属性/方法与对象实例相关
② 静态属性和方法通过类名 +
=>
符号进行调用实例属性和方法通过对象变量 +
->
符号进行调用
提示Tips:静态属性和方法不能访问实例属性和方法,实例属性和方法能访问静态属性和方法
补充扩展:方法的定义与调用
METHODS <meth>
IMPORTING … <i1> TYPE <type> …
EXPORTING … <e1> TYPE <type> …
CHANGING … <c1> TYPE <type> …
RETURNING … <r1> TYPE <type> …
EXCEPTIONS … X1 …
IMPORTING :数据输入 ,参数可以参考单个变量,结构或者内表EXPORTING :数据 输出,参数可以参考单个变量,结构或者内表CHANGING: 同时作为输入输出接口,\参数可以参考单个变量,结构或者内表RETURNING :返回类传递数值,该定义不能和 CHANGING / EXPORTING 同时使用EXCEPTIONS :返回执行中所出现的错误
方法调用的基本语法
CALL METHOD [oref->|class=>] meth
EXPORTING i1 = f1…
RECEIVING R = h.
当方法没有输出参数(EXPORTING)的时候可以通过以下方式调用:
CALL METHOD meth(). " 没有输入参数CALL METHOD meth( a ). " 一个输入参数CALL METHOD meth( f1 = a1………fn = an ) . " n 个输入参数