Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > クラス −3.オブジェクト
更新日:2005/7/25
クラス−3.オブジェクト
このページでは、クラスからオブジェクトを生成する方法、オブジェクトが持っている状態(メンバ変数)、振る舞い(メソッド)を参照する方法、そして使用しなくなったオブジェクトをメモリ領域から削除するガベージコレクションについて説明します。
オブジェクトの生成
ここでは、これまで何度か出てきたオブジェクトの生成について説明します。以下の枠内がオブジェクト生成のフォーマットです
クラス名 オブジェクト変数 = new コンストラクタ名(初期化値・・・);
オブジェクトの生成は3つの工程に分けることができます。

1.オブジェクト変数の宣言(クラス名 オブジェクト変数)
まずオブジェクトの参照情報を代入するオブジェクト変数の宣言を行います。この時点ではまだオブジェクトは生成されていません。単にメモリ領域に生成されるオブジェクトの参照情報を代入する変数が宣言されるだけです。
オブジェクト変数の宣言
2.オブジェクトの生成(new)
この時点で初めてメモリ領域にオブジェクトを格納するための領域が割り当てられます。new演算子はコンストラクタの呼び出しを行い、オブジェクト変数へ割り当てられたオブジェクト領域の参照情報を代入します。
オブジェクトの生成
3.オブジェクトの初期化(コンストラクタ名(初期化値・・・))
オブジェクトが生成された後、クラスに設定されたコンストラクタを使用しオブジェクトの初期化が行われます。コンストラクタ名はオブジェクトを生成したいクラス名と同一です。(初期化・・・)にはコンストラクタが受け取る引数値が記載されます。詳細はJavaの道:コンストラクタを参照してください。
オブジェクトの初期化
【例1】 オブジェクト生成の例です。
StringBuffer Object1 = new StringBuffer("Hello!");
//オブジェクト変数Object1、初期化値Hello!を持つ、
//StringBufferオブジェクトの宣言・生成。


StringBuffer Object1; //オブジェクト変数の宣言
Object1 = new StringBuffer("Hello!"); //オブジェクトの生成
//オブジェクト変数の宣言とオブジェクトの生成を分けて実施。
オブジェクトの参照
ここでは生成されたオブジェクトの状態(メンバ変数)や振る舞い(メソッド)を参照するための方法について説明します。メンバ変数、メソッドの参照は以下の枠内のフォーマットにより行います。
オブジェクト変数.メンバ変数;
オブジェクト変数.メソッド;
例えばクラスAというクラスからオブジェクトA1を生成した場合、オブジェクトA1のメソッドxyzを参照したい場合A1.xyz( )と記載します。変数abcを参照したい場合はA1.abcと記載します。これを図に表すと以下のようになります。
オブジェクトの参照
上記の仕組みによりメンバ変数、メソッドの参照が行われますが、プログラムを記載する際はいくつか注意点があります。メンバ変数、メソッドを定義したクラスと異なるクラスから参照する場合と、メンバ変数、メソッドを定義したクラスと同じクラスから参照する場合とではプログラムの記載方法が異なる点です。以下に例を記載します。
【異なるクラスから参照する場合】
class A {
void xyz() {
System.out.println("クラスAのxyzメソッド");
}
String abc = "クラスAの変数abc";
}

public class ExClass31 {
public static void main(String[] args) {
A A1 = new A(); //(1)オブジェクトA1の生成
A1.xyz(); //(2)メソッドxyzの参照
System.out.println(A1.abc); //(3)変数abcの参照
}
}
(1). クラスAのオブジェクトA1を生成します。
(2). クラスAのオブジェクトA1を生成します。
(3). オブジェクト変数A1を利用し、printlnメソッド内でクラスAの変数abcを参照しています。
【同じクラスから参照する場合】
class A {
  void xyz() {
    System.out.println("クラスAのxyzメソッド");
  }
  String abc = "クラスAの変数abc";
  void showA() {
    xyz();  //(3)メソッドxyzの参照
    System.out.println(abc);  //(4)変数abcの参照
  }
}

public class ExClass32 {
  public static void main(String[] args) {
    A A1 = new A();  //(1)オブジェクトA1の生成
    A1.showA();  //(2)メソッドshowAの参照
  }
}
(1). クラスAのオブジェクトA1を生成します。
(2). オブジェクト変数A1を利用し、クラスAのメソッドshowAを参照しています。
(3). メソッドshowAからxyzメソッドを参照しています。同一クラスからの参照のためオブジェクト変数を付ける必要はありません。
(4). メソッドshowAからprintlnメソッド内で変数abcをを参照しています。同一クラスからの参照のためオブジェクト変数を付ける必要はありません。
オブジェクト変数を指定しない(3)、(4)は、正確にはコンパイル時にthis.xyz( )、this.abcに変更されます。thisは現在実行されているメソッド(ここではshowA( ))が属するオブジェクトのオブジェクト変数(A1)を表します。xyz( )、abcは、this.xyz( )、this.abcと記載しても誤りではありません。thisの詳細はJavaの道:thisの利用を参照してください。

ここではメンバ変数、メソッドを参照する基本的な方法を説明しました。Javaではその他いくつかの参照方法が用意されています。それらの説明についてはJavaの道:staticを参照してください。
ガベージコレクション
Javaでは不要になったオブジェクトのメモリ領域を開放するガベージコレクションと言う仕組みを持っています。他のプログラム言語ではこのメモリ領域の開放をプログラマが意図的に行わなければならない場合もあります。メモリ領域の開放は非常に煩雑な作業であり、また間違いやすいものでもあります。メモリ領域の自動開放はJavaプログラムのメリットの一つです。なお、メソッド内で宣言された引数やローカル変数はそのメソッドが終了するとそれらに割り当てられたメモリ領域も開放されます。

開放されるオブジェクトのメモリ領域はそのオブジェクトがどのオブジェクト変数を通しても参照されなくなった時です。JavaVMに使用しなくなったオブジェクト変数を意図的に通知するためにはオブジェクト変数にnullを代入します。

ガベージコレクションを意図的に操作することはできません。Javaにはガベージコレクションに関連するコマンドでgcというものがあります。このコマンドはJavaVMにメモリの最適化を行うよう最大限の努力をすることを通知するものです。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道