Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース


クラスの宣言

最少限として、クラス宣言が class キーワードと定義しているクラス名を含まなくてはならない。 したがって最も単純なクラス宣言は次のようになる。

class NameOfClass {
    . . .
}

例えば、次のコードは ImaginaryNumber という新規クラスを宣言する。

class ImaginaryNumber {
    . . .
}

クラス名は正当な Java の識別子でなければならず、因習的に大文字で始める。 しばしば、このような最小のクラス宣言が必要となる。 しかし、クラス宣言はいっそうクラスについて示すことができる。 特に、クラス宣言内で次のことができる。

クラスのスーパークラスの宣言

Java では、すべてのクラスがスーパークラスを持っている。 クラスのスーパークラスを指定しなければ、(java.langで宣言した )Object クラスであると仮定される。 宣言は明示的にそれが何かであると宣言しなかったので、ImaginaryNumber のスーパークラスはObjectである。 Object クラスについての情報は、 java.lang.Object クラスを参照のこと。

明示的にオブジェクトのスーパークラスを指定するために、次のように、extendsキーワードとスーパークラス名を宣言しているクラス名とクラス本体を開く中括弧の間に置く。

class NameOfClass extends SuperClassName {
    . . .
}

例えば、ImaginaryNumber のスーパークラスを Object クラスではなく、 Number クラスにしたい場合は、次のように書く。

class ImaginaryNumber extends Number {
    . . .
}

これは明示的に Number クラスが ImaginaryNumber のスーパークラスであると宣言する。 ( Number クラスは java.lang パッケージの一部であり、Integer、Floatおよび他の数の基本クラスである。)

Numberが暗黙的に ImaginaryNumber のスーパークラスであると宣言すると、ImaginaryNumber がNumberのサブクラスであることになる。 サブクラスはスーパークラスから変数とメソッドを継承する。 サブクラスを作成することは、クラス宣言に extends 節 を含めるくらい簡単である。 しかし、メソッドをオーバーライドするようにクラスをサブクラス化する時は、通常コードで準備をしなければならない。 サブクラスの作成に関する詳細については、サブクラス、スーパークラス、継承を参照のこと。

クラスが実装するインタフェースの一覧

クラスを宣言する時、もしあれば、クラスによって実装されるインタフェースを指定することができる。 インタフェースとは何か? インタフェースはメソッドの実装を指定しないで、メソッドと定数のセットを宣言する。クラスがインタフェースの実装を要求する時は、インタフェースで宣言したメソッドのすべてを実装することを要求している。

クラスが1つ以上のインタフェースを実装すると宣言するには、キーワードimplementsに続けて、クラスで実装するインタフェースをカンマで区切って列挙する。 例えば、 add()subtract()などのメソッドを定義するArithmetic というインタフェース想定する。 ImaginaryNumber クラスは、次のように Arithmetic インタフェースを実装すると宣言することができる。

class ImaginaryNumber extends Number implements Arithmetic {
    . . .
}

それにより、Arithmetic インタフェースが宣言する add() subtract() と 他のメソッドを実装することが保証される。もし ImaginaryNumber に Arithmetic で定義するメソッドの実装が 欠けている場合、コンパイラはエラーメッセージをプリントし、プログラムのコンパイルを拒否する。

nothing.java:5: class ImaginaryNumber must be declared abstract.
 It does not define java.lang.Number add(java.lang.Number, java.lang.Number) from interface Arithmetic.
                  class ImaginaryNumber extends Number implements Arithmetic {
                        ^

規約によって、 implements 節 は、もしあるならば extends 節 の後に続く。

Arithmetic インタフェースで宣言したメソッドのメソッドシグニチャは、ImaginaryNumber クラスで実装するメソッドのメソッドシグニチャと一致しなくてはならないことに注意しよう。 インタフェースの作成と使用の方法に関する情報は、インタフェースの作成と使用を参照のこと。

public 、 Abstract および final クラス

クラスが public 、abstract、あるいは final であると宣言するために、クラス宣言で3つの修飾子のうち1つを使用することができる。 修飾子は class キーワードの前に置く。これはオプションである。

public 修飾子は、クラスが現在のパッケージの外でオブジェクトによって使用されることができることを宣言する。 デフォルトでは、クラスは宣言される同じパッケージの他のクラスによって使用されるだけである。 他のクラスとオブジェクトが ImaginaryNumber を使用したい時は、クラスを public に宣言する。

public class ImaginaryNumber extends Number implements Arithmetic {
    . . .
}

規約により、クラス宣言で public キーワードを使用する場合は、宣言でそれを一番最初の項目にする。

abstract 修飾子はクラスが抽象クラスであることを宣言する。 abstract クラスが抽象メソッド(実装がないメソッド)を含むことがある。 abstract クラスはサブクラス化されるようになり、インスタンス化されない。 abstract クラスが適切である場合とabstract クラス を書く方法については、 Abstract クラスとメソッドの書き方を参照のこと。

final修飾子を使用して、クラスが final であると宣言することができる。すなわち、クラスはサブクラス化されない。 final を宣言するには、(少なくとも)安全と設計上の理由がある。 final クラスの詳細については、、 Final クラスとメソッドの書き方を参照のこと。

クラスが final と abstract の両方であるのは意味をなさないので注意すること。 換言すれば、未実装のメソッドを含むクラスは final であるはずがない。 final と abstract の両方としてクラスを宣言しようとすると、コンパイル時エラーをもたらす。

クラス宣言の要約

要約すると、クラス宣言は、次のようになる。

[ modifiers ] class ClassName [ extends SuperClassName ] [ implements InterfaceNames ] {
    . . .
}

[と] の間の項目はオプションである。 クラス宣言が次のクラスの局面を定義する。


クラス宣言の項目は、class キーワードとクラス名だけが必要になる。 その他はオプションである。 オプションの項目に明示的な宣言を行わないと、 Java コンパイラは特定のデフォルトを仮定する(非 final、非 public、非 abstract、インタフェースを実装しないObjectのサブクラス)。


Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース