Java -インスタンスの生成と破棄-
コンストラクタ
通常はコンストラクタを利用してメンバ変数値を初期化する作業を行います。
コンストラクタとは、クラスをインスタンス化する際に自動的に実行される特殊なメソッドのことです。
コンストラクタ名([引数型1 引数名1,[引数型2 引数名2…]]){…}
※ []は省略可能
- コンストラクタ名は、クラス名と必ず同じ名前にしなければなりません。
- コンストラクタには戻り値の型を指定することはできません。
- 戻り値を指定すると通常のメソッドとして扱われることになります。
- 戻り値がない場合に指定するvoidを付けることもできません。
- コンストラクタは、インスタンスの生成時に利用します。
- 明示的にコンストラクタを指定していなくても自動的に呼び出される場合があります。
- コンストラクタの前にnew演算子を付けて、新しいインスタンスを生成します。
クラス名 参照型変数名 = new コンストラクタ名([引数型1 引数名1,[引数型2 引数名2…]]){…}
※ []は省略可能
デフォルトコンストラクタ
クラス内に1つもコンストラクタを定義しない場合は、自動的に引数を1つも持たないコンストラクタが自動的に生成されます。このようなコンストラクタをデフォルトコンストラクタといいます。
1つでも引数を持つコンストラクタを記述すると、そのクラスにはデフォルトコンストラクタは生成されません。
コンストラクタのオーバーロード
コンストラクタは通常のメソッド同様、1つのクラス内に複数定義することができます。
ただし、通常のメソッド同様、コンストラクタの引数の型か引数の数、または、引数の型の並びが異なっている必要があります。
thisキーワードの利用
- メソッド内にメンバ変数と同じ名前のローカル変数がある場合、ローカル変数が優先して利用されます。
この時「this.変数名」と指定すると、インスタンス内のメンバ変数を指定することができます。 - 同じクラス内のメソッドは、「this.メソッド名([引数の指定])」と記述することもできます。
- 「this([引数の指定])」と記述した場合は、同じクラス内の他のコンストラクタを実行することができます。
自分自身を呼び出すためにこれを利用することはできません。 - また、「this(引数の指定)」は、必ずコンストラクタの最初の文として記述しなければなりません。
- スーパークラスのコンストラクタを実行するための「super(引数の指定)」と同時に利用することはできません。
- コンストラクタは、通常のメソッドとは異なり継承が行われないため、スーパークラスで定義されたコンストラクタをオーバーライドすることはできません。
スーパークラスのコンストラクタの自動実行
あるクラスをインスタンス化する際、そのクラスのスーパークラスも自動的にインスタンス化されます。
この時スーパークラスのコンストラクタは、インスタンス化するクラスのコンストラクタに先立って自動的の実行されます。
ファイナライザとガベージコレクション
コンストラクタがインスタンスの生成時に自動的に実行されるメソッドであるのと反対にファイナライザは、インスタンスの破棄時、すなわちメモリからそのインスタンスの領域が消去される直前に実行されるメソッドです。
protected void finalize() throws Throwable()
ファイナライザはコンストラクタと異なり、通常のメソッドと同様に、他のクラスから明示的に呼び出すことができます。
ただし、ファイナライザを呼び出しても、実際にインスタンスがいつ破棄されるかは予想できません。
実際のメモリ管理は、
ガベージコレクションによって行われるからです。
ガベージコレクション
メモリを効率的に利用するために、ガベージコレクションが自動的に不要になったインスタンスをメモリから消去する作業を行います。
ガベージコレクションを促すためのメソッド
System.gc();
Ruutime,getRuntime().gc();
破棄が可能なインスタンス
- どこからも参照されていないインスタンス
- finalizeメソッドが呼び出されたインスタンス
- オブジェクトどうしが参照がの関係にあるが、それ以外からは独立しており、参照することができないインスタンス群