对象与引用

对象与引用 (★★★)

#abap-objects #oo-basics #class-definition

概览表

项目 关键点
引用变量 指向对象的指针,用 TYPE REF TO 声明
CREATE OBJECT 在内存中创建类的新实例
垃圾回收 无引用的对象自动被回收
自引用 ME 方法内指向当前对象自身的引用

引用变量

引用变量是指向对象的指针

1
DATA: ref_vehicle TYPE REF TO lcl_vehicle.
  • 声明时引用变量为初始值 (不指向任何对象)
  • 使用 CREATE OBJECT 创建实际对象

创建对象

1
2
3
4
5
" 声明引用
DATA: vehicle TYPE REF TO lcl_vehicle.

" 创建对象实例
CREATE OBJECT vehicle.

对象在内存中的表示

1
2
3
4
5
6
引用变量:  vehicle ──────→ ┌───────────────────┐
│ LCL_VEHICLE 实例 │
│ make = "" │
│ model = "" │
│ speed = 0 │
└───────────────────┘
📌引用 vs 对象
  • 引用变量和对象是两个不同的东西
  • 多个引用变量可以指向同一个对象
  • 引用变量本身也可以是对象的属性(关联关系)

多个引用指向同一对象

1
2
3
4
5
DATA: ref1 TYPE REF TO lcl_vehicle,
ref2 TYPE REF TO lcl_vehicle.

CREATE OBJECT ref1.
ref2 = ref1. " ref1 和 ref2 指向同一个对象

访问对象组件

1
2
3
4
5
6
7
8
" 访问属性
WRITE: / vehicle->make.

" 调用方法
vehicle->set_type( iv_make = 'BMW' iv_model = 'X5' ).

" 静态组件访问
WRITE: / lcl_vehicle=>count. " 类名=>组件名
语法 用途 示例
ref->attr 通过引用访问实例属性 vehicle->make
ref->meth( ) 通过引用调用实例方法 vehicle->set_type( )
class=>attr 访问静态属性 lcl_vehicle=>count
class=>meth( ) 调用静态方法 lcl_vehicle=>get_count( )

垃圾回收 (Garbage Collection)

ABAP 运行时系统自动管理对象的生命周期:

  • 当对象没有任何引用指向它时,成为垃圾
  • 垃圾回收器会自动清理这些对象
  • 开发者不需要手动释放内存
1
2
3
ref1 ──→ [对象A]     ← 有引用,不会被回收
ref2 ──→ [对象B] ← 有引用,不会被回收
[对象C] ← 无引用,将被垃圾回收

对象作为属性(关联)

对象引用可以作为其他对象的属性,实现关联关系:

1
2
3
4
CLASS lcl_vehicle DEFINITION.
PRIVATE SECTION.
DATA: mo_motor TYPE REF TO lcl_motor. " 组合关系
ENDCLASS.

内表中存储对象引用

1
2
3
4
5
6
7
8
9
DATA: lt_vehicles TYPE TABLE OF REF TO lcl_vehicle.

" 添加引用到内表
APPEND vehicle TO lt_vehicles.

" 遍历
LOOP AT lt_vehicles INTO DATA(lo_veh).
lo_veh->display( ).
ENDLOOP.

考试/测试模式

场景/关键词 答案
“->” vs “=>” -> 用于实例组件,=> 用于静态组件
“对象何时被回收” 没有引用指向时自动回收
“引用变量初始值” 不指向任何对象(NULL引用)
“对象存在哪里” 与程序相同的内部会话中,独立数据区