さて次に、今まであまり深く考えてこなかった、クラスやメソッドの定義について、もう少し理解を深めることにしましょう。まずはクラスの定義からです。クラス定義は、このような形で記述します。
【修飾子】class クラス名【extends クラス】
【implements インターフェイス】
以上のうちの【】で囲まれた部分はオプションで、使わないこともあります。
まず「
修飾子」というものから。これはクラスや、メソッド、クラスにおいてある変数なんかでも使われます。けっこういろいろあるんですが、以下のものぐらい知っておきましょう。
「
public」
これは、「このクラスは一般公開します」というときに使います。これを使うと、そのクラスは他のパッケージなどから自由に呼び出せるようになります。これを指定しないと、そのクラスのあるパッケージ内からしか呼び出せません。
「
private」
これは、同じパッケージからしか使えないってときのものです。まあクラスだとわからないでしょうが、メソッドでは「クラスの外から使えない」ってことになります。
「
protected」
これはprivateとpublicの間みたいなもんで、同じパッケージから使えます。要するに「仲間内だけ使える」ってものですね。
(なし)何もつけないと、同じパッケージ内とサブクラスから使えるよういなります。
「
final」
これは、避妊宣言です(笑)。これを使うと、もうこのクラスの子供は作れなくなります。つまり、継承してサブクラスを作れなくなるのです。
「
abstract」
これは「抽象クラス」という宣言に使うものです。抽象クラスというのは難しいんですが、「実体化されないクラス」と考えてください。つまり、インスタンスを生成できないクラスなのです。
クラスの定義につけるものとしては、「
extends」「
implements」というのも登場しましたね。
「
extends」
これは、あるクラスを継承したサブクラスとしてクラスを定義したいときに使うものでしたね。
「
implements」
イベントリスナーで登場しました。これは「継承できないんだけど使いたいクラスを利用できるようにする」というものでしたね。例えば、「A」というクラスを継承したクラスを定義するのだけど、その中でどうしても、全く「A」とは関係のない「B」というクラスの機能を使いたい、と思ったとしましょう。extendsによる継承は、1つのクラスからしか継承できません。そこで、
class X extends A implements 《Bのインターフェイス》
このようにクラス定義を行なうことで、Aを継承しながらBの機能も使えるようにすることができるというわけです。このimplementsは、1つだけでなく、カンマで区切っていくつも続けて記述できます。こうすることで、いくつもの機能を全部使えるようになるのです。
ただし、これには制限があります。「クラスBにインターフェイスと呼ばれるものが用意されていないと利用できない」ということです。インターフェイスというのは、そのクラスの外部とやりとりをするための機能で、クラスによってはこれが用意されているものといないものがあります。
――まあ、
implementsについては、イベント処理以外には当分は使わないでしょうから、今は「イベント処理用の機能だ」という程度に考えておけばいいでしょう。
では、以上を頭に入れて、前に作成したTest5クラスの宣言部分を見てみましょう。これは、このようになっていました。
public class Test5 extends Frame {……
ここでやっと、全ての意味が理解できたわけです。そう、Test5はFrameを継承し、他から自由にアクセスできるpublicなクラスとして宣言されていた、というわけですね。