!--a11y-->
オブジェクトはプログラムのメモリ領域にあるクラスの実行時インスタンスです。プログラムは参照変数と呼ばれるポインタを使って個別オブジェクトにアクセスします。クラスのインスタンスを登録するには、クラスと同じデータ型の参照変数が必要です。参照変数を登録するときは、新しいデータ型のオブジェクト参照を使用します。
参照変数
参照変数を宣言するときは、
命令
DATA < オブジェクト > TYPE REF TO < クラス > を使用します。システムは最初に、同じプログラム内のローカルのクラス
<class> の定義を探します。それが見つからないと、クラスライブラリをグローバルに検索します。参照変数は、タイプ <class> のオブジェクト変数とも呼ばれます。データ型 <class> のオブジェクト変数 <obj> はクラス <class> のインスタンスをポイントできる だけです。オプション
TYPE REF TO <class> を ABAP 命令で使用すれば、たとえば TYPES 命令のなかで、またはルーチンのインタフェースパラメータのデータ型を指定するときに、データ型を指定することができます。オブジェクトインスタンス
クラス
<class> に対してオブジェクト変数 <obj> を宣言すると、命令CREATE OBJECT <obj>
を使ってオブジェクトを宣言することができます。クラス
<class> の実行時インスタンスがメモリに生成され、オブジェクト変数 <obj> はオブジェクトを参照します。プログラムはオブジェクト変数を使用してオブジェクトの パブリックコンポーネントにアクセスすることができます。オブジェクト変数 <obj> を使ってオブジェクトコンポーネントにアクセスするときは、次の構文を使用します。

次の例は、前のセクションで登録したクラス
C_COUNTER のインスタンスを登録する方法を示します( クラスとクラスコンポーネントを参照してください)。DATA REF_COUNTER_1 TYPE REF TO C_COUNTER.
DATA NUMBER TYPE I VALUE 5.
CREATE OBJECT REF_COUNTER_1.
CALL METHOD REF_COUNTER_1->SET_COUNTER
EXPORTING SET_VALUE = NUMBER.
DO 3 TIMES.
CALL METHOD REF_COUNTER_1->INCREMENT_COUNTER.
ENDDO.
CALL METHOD REF_COUNTER_1->GET_COUNTER
IMPORTING GET_VALUE = NUMBER.
最初の命令ではデータ型
C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の最初のオブジェクトをプログラムメモリに登録しています。オブジェクト変数 REF_COUNTER_1 はオブジェクトとそのインタフェースを参照します。
ABAP
プログラムはオブジェクト変数 REF_COUNTER_1 だけを使用してオブジェクトのパブリックメソッドにアクセスします。プログラムのこの部分が実行されると、プログラム変数 NUMBER と私用オブジェクト変数 COUNT の値は両方とも8となります。同じデータ型のオブジェクトを何個でも登録することができます。オブジェクトはそれぞれ完全に独立します。各オブジェクトにはそれ自身のプログラム内でのアイデンティティと属性があります。
CREATE OBJECT 命令を実行するつど、アイデンティティが一意のオブジェクト参照によって定義される新しいオブジェクトが生成されます。
次の例はプログラムがクラス
DATA: REF_COUNTER_1 TYPE REF TO C_COUNTER,
REF_COUNTER_2 TYPE REF TO C_COUNTER,
REF_COUNTER_3 LIKE REF_COUNTER_1.
DATA: NUMBER1 TYPE I VALUE 5,
NUMBER2 TYPE I VALUE 0,
NUMBER3 TYPE I VALUE 2.
CREATE OBJECT: REF_COUNTER_1,
REF_COUNTER_2,
REF_COUNTER_3.
CALL METHOD: REF_COUNTER_1->SET_COUNTER
EXPORTING SET_VALUE = NUMBER1,
REF_COUNTER_2->SET_COUNTER
EXPORTING SET_VALUE = NUMBER2,
REF_COUNTER_3->SET_COUNTER
EXPORTING SET_VALUE = NUMBER3.
DO 3 TIMES.
CALL METHOD REF_COUNTER_1->INCREMENT_COUNTER.
ENDDO.
CALL METHOD: REF_COUNTER_2->INCREMENT_COUNTER,
REF_COUNTER_3->INCREMENT_COUNTER.
CALL METHOD: REF_COUNTER_1->GET_COUNTER
IMPORTING GET_VALUE = NUMBER1,
REF_COUNTER_2->GET_COUNTER
IMPORTING GET_VALUE = NUMBER2,
REF_COUNTER_3->GET_COUNTER
IMPORTING GET_VALUE = NUMBER3.
最初の命令ではデータ型
C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の最初のオブジェクトをプログラムメモリに登録しています。該当するオブジェクト変数がこれらのオブジェクトを参照しています。
複数の参照変数が1つのオブジェクトをポイントすることができます。
CREATE OBJECT 命令とは別に、オブジェクト変数間の通常の割当命令( ABAP キーワード MOVE )を使ってオブジェクト変数をオブジェクトに割り当てることができます。その場合の条件は、個別オブジェクト変数はデータ型が同じでなければならないということだけです。そのため、同じクラスのオブジェクト間で参照の割当を変更することができるので、最初のオブジェクト変数がいつも同じオブジェクトをポイントするとはかぎりません。少なくとも1つのオブジェクト変数からポイントされているかぎり、オブジェクトは存在しつづけます。参照変数がオブジェクトをポイントしなくなった時点で、そのオブジェクトはガーベージコレクションメカニズム(オブジェクトの自動メモリ管理)によって削除されます。

次の例はプログラムがクラス
DATA: REF_COUNTER_1 TYPE REF TO C_COUNTER,
REF_COUNTER_2 TYPE REF TO C_COUNTER,
REF_COUNTER_3 LIKE REF_COUNTER_1.
CREATE OBJECT: REF_COUNTER_1,
REF_COUNTER_2.
MOVE REF_COUNTER_2 TO REF_COUNTER_3.
CLEAR REF_COUNTER_2.
REF_COUNTER_1 = REF_COUNTER_3.
最初の命令ではデータ型
C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の2つのオブジェクトをプログラムメモリに登録しています。オブジェクト変数 REF_COUNTER_1 と REF_COUNTER_2 はそれぞれの内部名が C_COUNTER<1> と C_COUNTER<2> のオブジェクトをポイントします。 MOVE 命令のあと、 REF_COUNTER_3 もオブジェクト C_COUNTER<2> をポイントします。
CLEAR
命令のあと、変数 REF_COUNTER_2 はオブジェクトを参照しなくなるので、その宣言の直後と同じ状態となります。最後の割当命令により、オブジェクト変数 REF_COUNTER_1 は C_COUNTER<1> から C_COUNTER<2> に割当が変更されます。