[SAP ABAP] 面向对象程序设计-属性和方法

news/2025/2/6 11:01:09/
属性( 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_doubley TYPE ty_doubleRETURNING 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=>powEXPORTINGx         = 25y         = 3RECEIVINGpow_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 stringname          TYPE stringage           TYPE int2current_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 DEFINITIONCLASS lcl_student IMPLEMENTATION.METHOD constructor.me->sid = sid.me->name = name.me->age = age.me->current_class = current_class.ENDMETHOD.                           " constructorMETHOD set_age.me->age = new_age.ENDMETHOD.                           " set_ageMETHOD set_class.me->current_class = new_class.ENDMETHOD.                           " set_classMETHOD 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 = 18current_class = '卓越21班'." 调用对象的属性和方法CALL METHOD s1->set_ageEXPORTINGnew_age = 20.*  s1->set_age( 20 ).CALL METHOD s1->set_classEXPORTINGnew_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:静态属性和方法不能访问实例属性和方法,实例属性和方法能访问静态属性和方法


http://www.ppmy.cn/news/1569777.html

相关文章

标准库发送数据深入理解USART

如何使用USART&#xff08;编程理论讲解&#xff09; 如下是串口发送信息的原理图&#xff0c;CPU将数据写入TDR寄存器&#xff0c;然后串口外设将寄存器中的数据发送出去 这就是串口发送的全部流程 (图中所有图片均来自博主 铁头山羊) 在这个发送流程的过程中&#xff0c;我…

如何在 Kafka 中实现自定义分区器

今天我来给大家分享一下如何在 Kafka 中实现一个自定义分区器。Kafka 是一个分布式流处理平台&#xff0c;能够高效地处理海量数据。默认情况下&#xff0c;Kafka 使用键的哈希值来决定消息应该发送到哪个分区&#xff0c;但是有时我们需要根据特定的业务逻辑来定制分区策略。这…

需求分析应该从哪些方面来着手做?

需求分析一般可从以下几个方面着手&#xff1a; 业务需求方面 - 与相关方沟通&#xff1a;与业务部门、客户等进行深入交流&#xff0c;通过访谈、问卷调查、会议讨论等方式&#xff0c;明确他们对项目的期望、目标和整体业务需求&#xff0c;了解项目要解决的业务问题及达成的…

S4 HANA手工记账Tax Payable – FB41

本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容&#xff1a; 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账&#xff0c;一般税码科目需要设置为只能自动记账&#xff0c;因此无法手工对税码统驭科目记账&#xff0c;但…

低代码系统-产品架构案例介绍、蓝凌(十三)

蓝凌低代码系统&#xff0c;依旧是从下到上&#xff0c;从左至右的顺序。 技术平台h/iPaas 指低层使用了哪些技术&#xff0c;例如&#xff1a;微服务架构&#xff0c;MySql数据库。个人认为&#xff0c;如果是市场的主流&#xff0c;就没必要赘述了。 新一代门户 门户设计器&a…

mac安装wireshark

mac启动wireshark时&#xff0c;提示没有权限抓包&#xff0c;报错内容如下&#xff1a; “The capture session could not be initiated on interface ‘en0’ (You don’t have permission to capture on that device). Please check to make sure you have sufficient perm…

celery策略回测任务运行及金融量化数据增量更新|年化18.8%,回撤8%的组合策略(python代码)

原创内容第787篇&#xff0c;专注量化投资、个人成长与财富自由。 昨天我们分享了量化数据的采集与增量更新&#xff1a;更新数据&#xff0c;年化18.8%&#xff0c;回撤8%的组合策略 | akshare与tushare历史日线数据下载与更新&#xff08;python代码&#xff09; 今天讲讲量…

复杂excel表格内容数据导入 接口参数注解校验

校验代码 // 校验文件内容List<CheckResult> checkResults CheckResult.checkResultList(excelDataList);String collect checkResults.stream().map(CheckResult::getMsg).collect(Collectors.joining(","));if (!CollectionUtils.isEmpty(checkResults))…