プログラミング応用a 第4回『クラス定義の基礎』 

※画像が大きすぎるときは,ブラウザの縮小を使って下さい(通常のWindows用Webブラウザの場合,コントロールキーを押しながら - キーを押すと縮小,コントロールキーを押しながら + キーを押すと拡大です)。

●オブジェクトの生成

では,クラスという設計図を元に,オブジェクトという製品を生産してみよう。そのためには前項で紹介したように new という演算子を使う。
しかし,そのまえに,オブジェクトは,前回習った配列のように,複数の部品から出来ていることを知ろう。

▼HTMLアニメーションによる解説(右下に「クリック」と表示されたらクリックで次に進めます)(ローカル再生用アーカイブファイル)
 ・オブジェクトは,クラス型のインスタンスではあるが,int型やdouble型の変数とは少し扱いが違う。
 ・実は,クラス型変数にはオブジェクト本体が「メモリ上のどこに居るか」という情報が入っているに過ぎない。
 ・クラス型変数はオブジェクトそのものではなく,オブジェクト本体への橋渡し役に過ぎない。
最初から再生
 ※アニメーションを再生しながら,かわりばんこに友人どうしで説明し合ってみよう。

上のHTMLアニメーションで説明されているように,オブジェクトは
 ・オブジェクト本体の場所情報(参照値)(を格納したクラス型変数) 
 ・オブジェクト本体
の2個の部品の組み合わせからなっている(下図Fig.5(b))。
この参照値を入れたクラス型変数の名前を,そのオブジェクトの名称として用いることがある。
下図Fig.5(b)の状況では,Person1型変数pにオブジェクト本体への参照値が入っているので,この本来は名前のないオブジェクト本体のことを便宜的に「オブジェクトp」と呼ぶことがある。

・実際にオブジェクト本体を生成するには,new演算子を使って下図の様に書けば良い。

【参考情報】:上記の(3)で紹介されている書式中の=で行われる処理((3)-②)は,正確には「代入」ではなく,「初期化」である。
        ここでは初心者用の説明として,同じものとして扱っている。


List 2 ( ソースプログラムのダウンロード)
▼HTMLアニメーションによる解説(右下に「クリック」と表示されたらクリックで次に進めます) (ローカル再生用アーカイブファイル)
最初から再生
※アニメーションを再生しながら,かわりばんこに友人どうしで説明し合ってみよう。

参考)List 2を単独のウィンドウで表示する
参考)List 2からコメントなどの余計な物を省いたシンプル版を単独のウィンドウで表示する

※なお,クラス型変数にnull値が入ったままオブジェクトを使おうとするとどうなるか試してみよう。List 2-③の文

  // System.out.println( p );

は,コメントで無効にされている(このように,プログラムの一部をコメント化して無効にすることを
「コメントアウトする」と言う)。この文を有効にして(//を消してプログラムの一部として復活させる),

  Person1 p;
  System.out.println( p );

という一連の流れを実行しようとするとEclipse上で以下の様なエラーが発生する。



pの値はnullのままで,何のオブジェクトも参照出来ていない状態でオブジェクトを利用しようとしている。
使おうとするオブジェクトを正しく指定出来ていないのだからエラーになって当たり前である!。

無理矢理実行することもできるが,その場合は実行中に以下の様なエラー(実行時エラー,例外と呼ばれる種類のエラー)
が表示され,実行が中断し強制終了される。



このようなエラーが発生したときには,null値を使ってオブジェクトを利用しようとしてないか,チェックし,
null値ではない,ちゃんと存在するオブジェクト本体を挿している参照値を使うように修正しよう。


●オブジェクトのメンバの利用法

 今までのアニメーション教材で見たように,
    ・オブジェクト本体に内蔵されたメンバを利用するには下図(1)のように指定する。
    ・(staticの付いていない)メソッドの中で,メンバの名前を書くと,それは自オブジェクトのメンバ名のことであった。
  例えば,すぐ上の解説アニメーションでは, talk( )メソッドの中で age と書けば,それは自オブジェクトの age フィールドのことであった。
  実は,自オブジェクトを表す this という特別なオブジェクト名を使って,明示的に自オブジェクトのメンバ名である事を示すことも出来る(下図(2))。


●オブジェクトの個性
 同じクラスのオブジェクトでも,個々のオブジェクトはその内部にあるフィールドの値によって「個性」を持つ。
下図では,同じPerson1型オブジェクトがそれぞれ,「20才の男性」と「18才の女性」を表していることを示している。


●ある意味,Javaなどで書かれたオブジェクト指向プログラムは,
 (1)オブジェクトを生成する
 (2)オブジェクトの機能(メソッド)を使う
 ということである,と言える。
 ※次のリストWindowOpener.javaは,ウィンドウを表すJFrameクラスのオブジェクトを生成して,その機能を使っている。
 ※このJFrameクラスのようにJavaには便利なクラスがたくさん用意されている。このように,便利なクラスをまとめたものをクラスライブラリと呼ぶ。
 ※面白いプログラムを作るには,Javaが用意しているクラスライブラリを見て,使えそうなクラスを探すと良い。

List "WindowOpener.java"
import javax.swing.*;  // JFrameクラスを使うために必要

public class WindowOpener {
  public static void main( String[] args ) {
    JFrame fr = new JFrame();  // ウィンドウを表すJFrame型のオブジェクトfrを生成
    fr.setSize( 200, 150 );    // JFrame型オブジェクトのメソッド setSize()でウィンドウのサイズを設定
    fr.setVisible( true );     // JFrame型オブジェクトのメソッド setVisible()でウィンドウを見えるようにする
    fr.setLocation( 100, 200 );// JFrame型オブジェクトのメソッド setLocation()でウィンドウの位置を設定
  }
}


次に進む