PR

●はじめに

 前回の講座で,クラスがソフトウエア部品のようなものであると説明しました。この部品は,自分で作らなければならないものと,あらかじめ提供されているものがあります。Javaは,様々な機能を持つ数多くのクラスの集合をクラス・ライブラリとして提供しています。今回は,クラス・ライブラリが提供する主なクラスの種類と,その使い方を説明しましょう。

●クラス・ライブラリが提供するクラスの種類

表1●Javaのクラスライブラリが提供する主なクラス
 Javaのクラス・ライブラリが提供する主なクラスの種類と機能を表1[拡大表示]に示します。クラス・ライブラリは,javaをルートとして階層的に整理されています。ここで示したクラスの下層にも数多くのクラスがあり,ドット(.)で区切って示されます。例えば,java.awtクラスの下層にあるFontクラス(フォントを取り扱う機能を提供します)なら,java.awt.Fontと表します。

 クラスの種類を見れば,Javaで何ができるか想像できるでしょう。時代に見合ったプログラムを作成するために必要となるGUI,マルチスレッド,およびネットワークなどの機能が,クラス・ライブラリとして提供されているのは,実に魅力的です。これは,ちょっと古いC言語やC++には真似のできないことです。

 クラスの使い方には,大きく分けて3つの方法があります。クラスのインスタンスを作成する方法,他のクラスで継承して使う方法,および他のクラスのフィールドとして使う方法です。これは,クラス・ライブラリが提供するクラスを使う場合でも,独自に作成したクラスを使う場合でも同じです。

●クラスのインスタンスを作成して使う

 クラスのインスタンスを作成して使う方法では,クラスのコピーをメモリー上に作成し,そのメモリー・アドレスを,クラス名をデータ型*とした変数に格納します。このような変数は,C言語やC++におけるポインタに相当するもので,Javaでは参照と呼びます。メモリ上ーに作成されたクラスのコピーをインスタンス(instance=実体)と呼びます。このようなところで,C言語やC++の知識が生きてきます。

 リスト1は,java.awt.Fontクラスのインスタンスを作成し,フォントの種類やサイズを設定して,「IT Pro」という文字列を表示するJavaアプレットの一部です。newは,クラスのインスタンスを作成することを表します。newの後に指定されているものは,インスタンスの作成時に呼び出される特殊なメソッドで,コンストラクタと呼ばれます。コンストラクタの名前は,クラス名と同じにする約束になっています。コンストラクタのパラメータには,クラスの持つフィールドを初期化する値を指定します。

 Fontクラスの正式名称は,java.awt.Fontですが,それを単にFontと記述できるのは,プログラムの先頭にimport java.awt.*;があるからです。importは,それ以降に指定されたクラスを使うことを示すものです。java.awt.*は,java.awtクラスの下層にあるすべてのクラスを表わしています。これによって,プログラムにFontと記述しても,java.awt.Fontと記述したことと同じになります。

 paintメソッドのパラメータgのデータ型は,Graphicsクラス(正式名称は,java.awt.Graphics)となっています。このクラスは,グラフィックスの描画機能を提供します。paintメソッドを呼び出す側は,Graphicsクラスのインスタンスを作成し,そのメモリー・アドレスをパラメータgに与えることになります。したがって,paintメソッドが呼び出された時点で,すぐにGraphicsクラスのメソッドやフィールドが使用可能となります。

 クラスの持つメソッドやフィールドは,「インスタンス名.メソッド名」や「インスタンス名.フィールド名」のように指定します。setFontメソッドやdrawStringメソッドは,Graphicsクラスの持つメソッドです。それが,g.setFontやg.drawStringのように,インスタンス名と一緒に指定されているのです。

●クラスを継承して使う

図1●Appletクラスのpaintメソッドをオーバーライドする
 既存のクラスを継承すれば,そのクラスの持つメソッドやフィールドが引き継がれます。前回の講座で説明しましたが,Javaアプレットは,Appletクラス(正式名称はjava.applet.Applet)を継承して作成されます。Appletクラスを継承したクラスでは,Appletクラスの持つメソッドやフィールドを自分自身の機能のように使うことが可能となります。

 もしも,Appletクラスの持つメソッドの機能を変更したいなら,そのメソッドを定義し直すだけでOKです。これを,メソッドのオーバーライド(上書き)と呼びます。Javaアプレットのpaintメソッドは,Appletクラスの持つメソッドであり,画面に文字列やグラフィックスの描画が必要になったときに自動的に呼び出されるが,何も描画しないという機能をもっています。paintメソッドをオーバーライドし,その処理として目的の文字列やグラフィックスを描画するのが,Javaアプレットの定番です(図1[拡大表示])。

●クラスのフィールドとして使う

 クラスの持つフィールドのデータ型に,他のクラスを指定することもできます。これは継承とは別のクラスの再利用方法で,合成と呼ばれます。合成では,オーバーライドができないことになりますが,クラスの持つメソッドやフィールドの機能は,そのまま使えます。

 例えば,Javaアプリケーションで画面に文字列を表示するためのSystem.out.printlnは,Systemクラスのフィールドoutの持つprintlnメソッドを表わしています。outは,java.io.PrintStreamクラスをデータ型としたフィールドです。printlnメソッドは,java.io.PrintStreamクラスの持つメソッドです。

●おわりに

 オブジェクト指向プログラミングでは,既存のクラスを再利用することが重要です。それが,オブジェクト指向プログラミングの目的である「プログラミングの効率化」を実現するものとなるからです。プログラムのすべての部分を自分で記述しないと気が済まないようなプログラマは,考え方を変えなければなりません。

 この講座をお読みいただいたことが,Javaをはじめるきっかけとなれば幸いです。Javaのプログラムの説明の中には,すぐに理解できなかったこともあるかもしれません。プログラミング言語の学習は,実際に様々なプログラムを作成して,その動作を確認することが一番です。JDKは無償で入手できます。市販の開発ツールを使ってもいいでしょう。皆さんのご健闘をお祈り申し上げます!