![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |
クラスの宣言では、クラスが別のクラスのサブクラスであると宣言する。 例えば、 Number クラスのサブクラス ImaginaryNumber を作成すると仮定すると ( Number クラスは java.lang パッケージの一部であって、 Integers 、 Floats および他の数の基本クラスである。) 次のようになる。ここでは、SubClass がスーパークラスクラスのサブクラスであると宣言している。 同様に SuperClass が SubClass のスーパークラスであると暗黙に宣言している。 サブクラスは、そのスーパークラスのスーパークラスなど継承ツリーの上からも変数とメソッドを継承する。 説明を容易にするために、この入門書ではクラスのスーパークラスを言及する時は、そのすべての上位クラスと同様にクラスの直接の祖先を意味する。class SubClass extends SuperClass { . . . }サブクラスを作成することは、(上記の ImaginaryNumber 宣言のように)クラス宣言で
extends
節 を組み込むくらい単純である。 しかし、メソッドをオーバーライドするようなクラスをサブクラス化する時は、通常コードで準備をしなければならない。サブクラスが何のメンバ変数を継承するか?
規則: サブクラスは、そのサブクラスにアクセス可能なスーパークラス内のメンバ変数すべてを継承する(メンバ変数がサブクラスにより隠ぺいされない場合)。
すなわち、サブクラスは
public
あるいはprotected
として宣言されたメンバ変数を継承する。
- サブクラスがパッケージとして同じクラスである限り、アクセス指示子(「friendly」として知られる)なしで宣言されるメンバ変数を継承する
- サブクラスが同一名を使用しているメンバ変数を宣言する場合、スーパークラスのメンバ変数は継承しない。 サブクラスのメンバ変数は、スーパークラスでメンバ変数を隠ぺいすると言われる。
private
メンバ変数を継承しない
「 PENDING: 例の表示」メンバ変数の隠ぺい
前の節で述べたように、サブクラスで定義するメンバ変数は、スーパークラスで同一名のメンバ変数を隠す。「PENDING: これが有用であるかも知れない理由の例」。
Java 言語のこの機能は強力で便利ではあるが、エラーを起こしやすいソースにもなりうる。故意あるいは偶然に、メンバ変数を隠すことができるので、メンバ変数を指定する時は、実際に隠したいメンバ変数だけをを隠すように注意する。
Java メンバ変数の面白い機能として、クラスがスーパークラスを通して隠ぺいされたメンバ変数をアクセスすることができる。
「保留。ここで良い例を提供して、次の一致するべき para の1対を書き換える」
例えば、同じく
anInteger
を指定して、IntegerClass 内の変数宣言はスーパークラスで宣言を隠す。 以下とともにスーパークラスのanInteger
をアクセスすることができる。super.anInteger
super
はJava 言語のキーワードであり、これによってメソッドは、影の変数やオーバーライドされたメソッドを参照することができる。サブクラスはどのメソッドを継承するか?
メソッドがサブクラスにより継承されると指定するルールは、メンバ変数のルールに類似している。規則:サブクラスは、そのサブクラスがアクセス可能なスーパークラス内のメソッドすべてを継承する(メソッドがサブクラスによりオーバーライドされない場合)。
すなわち、サブクラスは
public
あるいはprotected
として宣言されたメソッドを継承する
- サブクラスがパッケージと同じクラスである限り、アクセス指示子なしで宣言されたメソッドを継承する
- サブクラスが同一名を使用しているメソッドを宣言する場合、スーパークラスのメソッドを継承しない サブクラスでのメソッドは、スーパークラスのメソッドをオーバーライドすると言われる。
private
メソッドを継承しない
「 PENDING: show 例」メソッドのオーバーライド
サブクラスはそのスーパークラスでメソッドをオーバーライドすることができるので、クラスはその振る舞いが「十分近い」スーパークラスから継承して、そのスーパークラスの振る舞いを補ったり変更することができる。
![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |