对象与引用 (★★★)
#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 │ └───────────────────┘
|
- 引用变量和对象是两个不同的东西
- 多个引用变量可以指向同一个对象
- 引用变量本身也可以是对象的属性(关联关系)
多个引用指向同一对象
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引用) |
| “对象存在哪里” |
与程序相同的内部会话中,独立数据区 |