![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |
最少限として、クラス宣言がclass
キーワードと定義しているクラス名を含まなくてはならない。 したがって最も単純なクラス宣言は次のようになる。例えば、次のコードは ImaginaryNumber という新規クラスを宣言する。class NameOfClass { . . . }クラス名は正当な Java の識別子でなければならず、因習的に大文字で始める。 しばしば、このような最小のクラス宣言が必要となる。 しかし、クラス宣言はいっそうクラスについて示すことができる。 特に、クラス宣言内で次のことができる。class ImaginaryNumber { . . . }
- クラスのスーパークラスを宣言する
- クラスが実装するインタフェースを一覧表示する
- クラスが public 、 abstract 、あるいはfinalであるかどうかを宣言する
クラスのスーパークラスの宣言
Java では、すべてのクラスがスーパークラスを持っている。 クラスのスーパークラスを指定しなければ、(java.langで宣言した )Object クラスであると仮定される。 宣言は明示的にそれが何かであると宣言しなかったので、ImaginaryNumber のスーパークラスはObjectである。 Object クラスについての情報は、 java.lang.Object クラスを参照のこと。明示的にオブジェクトのスーパークラスを指定するために、次のように、
extends
キーワードとスーパークラス名を宣言しているクラス名とクラス本体を開く中括弧の間に置く。例えば、ImaginaryNumber のスーパークラスを Object クラスではなく、 Number クラスにしたい場合は、次のように書く。class NameOfClass extends SuperClassName { . . . }これは明示的に Number クラスが ImaginaryNumber のスーパークラスであると宣言する。 ( Number クラスは java.lang パッケージの一部であり、Integer、Floatおよび他の数の基本クラスである。)class ImaginaryNumber extends Number { . . . }Numberが暗黙的に ImaginaryNumber のスーパークラスであると宣言すると、ImaginaryNumber がNumberのサブクラスであることになる。 サブクラスはスーパークラスから変数とメソッドを継承する。 サブクラスを作成することは、クラス宣言に
extends
節 を含めるくらい簡単である。 しかし、メソッドをオーバーライドするようにクラスをサブクラス化する時は、通常コードで準備をしなければならない。 サブクラスの作成に関する詳細については、サブクラス、スーパークラス、継承を参照のこと。クラスが実装するインタフェースの一覧
クラスを宣言する時、もしあれば、クラスによって実装されるインタフェースを指定することができる。 インタフェースとは何か? インタフェースはメソッドの実装を指定しないで、メソッドと定数のセットを宣言する。クラスがインタフェースの実装を要求する時は、インタフェースで宣言したメソッドのすべてを実装することを要求している。クラスが1つ以上のインタフェースを実装すると宣言するには、キーワード
implements
に続けて、クラスで実装するインタフェースをカンマで区切って列挙する。 例えば、add()
、subtract()
などのメソッドを定義するArithmetic というインタフェース想定する。 ImaginaryNumber クラスは、次のように Arithmetic インタフェースを実装すると宣言することができる。それにより、Arithmetic インタフェースが宣言するclass ImaginaryNumber extends Number implements 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 ] { . . . }
- modifiersはクラスが public、 abstract、あるいは final のいずれであるか宣言する。
- ClassNameは宣言しているクラス名を設定する。
- SuperClassNameは ClassNameのスーパークラス名である。
- InterfaceNames は、ClassNameによって実装されるインタフェースをコンマで区切って表示する。
クラス宣言の項目は、class
キーワードとクラス名だけが必要になる。 その他はオプションである。 オプションの項目に明示的な宣言を行わないと、 Java コンパイラは特定のデフォルトを仮定する(非 final、非 public、非 abstract、インタフェースを実装しないObjectのサブクラス)。
![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |