継承
前のレッスンでは、継承について何度か言及しました。 Java言語では、クラスは他のクラスから派生できるため、それらのクラスからフィールドとメソッドを継承できます。
スーパークラスを持たない
Object
を除いて、すべてのクラスにスーパークラスがあり、直接スーパークラスは1つだけ(単一継承)。他の明示的なスーパークラスがない場合、すべてのクラスは暗黙的にObject
のサブクラスになります。クラスは、クラスから派生したクラスから派生したクラスから派生できます。など、最終的には最上位クラスの
Object
から派生します。このようなクラスは、Object
まで遡る継承チェーン内のすべてのクラスの子孫であると言われています。 継承の考え方はシンプルですが強力です。新しいクラスを作成する必要があり、必要なコードの一部を含むクラスがすでに存在する場合は、既存のクラスから新しいクラスを派生させることができます。 。これを行うことで、既存のクラスのフィールドとメソッドを自分で作成(およびデバッグ)せずに再利用できます。
サブクラスは、からすべてのメンバー(フィールド、メソッド、およびネストされたクラス)を継承します。そのスーパークラス。コンストラクターはメンバーではないため、サブクラスに継承されませんが、スーパークラスのコンストラクターはサブクラスから呼び出すことができます。
Javaプラットフォームクラス階層
iv id = java.lang
パッケージで定義されている “e946c849b8″>
クラスは、作成したクラスを含むすべてのクラスに共通の動作を定義および実装します。 Javaプラットフォームでは、多くのクラスがObject
から直接派生し、他のクラスはそれらのクラスの一部から派生するなど、クラスの階層を形成します。
Javaプラットフォームのすべてのクラスはオブジェクトの子孫です
階層の最上位では、Object
がすべてのクラスの中で最も一般的です。階層の最下部に近いクラスは、より特殊な動作を提供します。
継承の例
これは、Bicycle
クラス:
MountainBike
クラスのクラス宣言。は次のようになります:
public class MountainBike extends Bicycle { // the MountainBike subclass adds one field public int seatHeight; // the MountainBike subclass has one constructor public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } // the MountainBike subclass adds one method public void setHeight(int newValue) { seatHeight = newValue; } }
MountainBike
は継承しますBicycle
のすべてのフィールドとメソッド、およびフィールドseatHeight
とそれを設定するメソッドを追加します。コンストラクターを除いて、4つのフィールドと5つのメソッドを使用して、新しいMountainBike
クラスを完全にゼロから作成したかのようになります。ただし、すべての作業を行う必要はありませんでした。これは、Bicycle
クラスのメソッドが複雑で、デバッグにかなりの時間がかかった場合に特に役立ちます。
サブクラスでできること
サブクラスは、サブクラスがどのパッケージに含まれているかに関係なく、親のすべてのパブリックメンバーと保護されたメンバーを継承します。サブクラスがそのサブクラスと同じパッケージにある場合親、親のパッケージプライベートメンバーも継承します。継承されたメンバーをそのまま使用したり、置き換えたり、非表示にしたり、新しいメンバーで補足したりできます。
- 継承されたフィールドでは、次のことができます。他のフィールドと同じように、直接使用できます。
- サブクラスのフィールドをスーパークラスのフィールドと同じ名前で宣言して、非表示にすることができます(非推奨)。
- スーパークラスにないサブクラスの新しいフィールドを宣言できます。
- 継承されたメソッドはそのまま直接使用できます。
- 新しいインスタンスメソッドを記述できます。そのサブクラスはスーパークラスの署名と同じであるため、オーバーライドされます。
- スーパークラスの署名と同じ署名を持つ新しい静的メソッドをサブクラスに記述して、非表示にすることができます。
- スーパークラスにない新しいメソッドをサブクラスで宣言できます。
- 暗黙的に、またはキーワード
。
このレッスンの次のセクションでは、これらのトピックについて詳しく説明します。
スーパークラスのプライベートメンバー
サブクラスは、その親クラスのprivate
メンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたはプロテクトメソッドがある場合、これらはサブクラスでも使用できます。
ネストされたクラスは、フィールドとメソッドの両方で、それを囲むクラスのすべてのプライベートメンバーにアクセスできます。したがって、サブクラスによって継承されたパブリックまたは保護されたネストされたクラスは、スーパークラスのすべてのプライベートメンバーに間接的にアクセスできます。
オブジェクトのキャスト
オブジェクトはインスタンス化されたクラスのデータ型。たとえば、次のように記述した場合
public MountainBike myBike = new MountainBike();
myBike
のタイプはMountainBike
。
MountainBike
はBicycle
とObject
。したがって、MountainBike
はBicycle
であり、Object
でもあります。 Bicycle
またはObject
オブジェクトが必要な場合は常に使用されます。
その逆は必ずしも当てはまりません:Bicycle
はMountainBike
の場合がありますが、必ずしもそうとは限りません。同様に、Object
はBicycle
またはMountainBike
ですが、必ずしもそうとは限りません。
キャストは、1つのオブジェクトの使用を示します。継承と実装によって許可されたオブジェクトの中で、別のタイプの代わりにタイプします。たとえば、
Object obj = new MountainBike();
と書くと、obj
は両方ともObject
とMountainBike
(obj
にobj
以外の別のオブジェクトが割り当てられるまでdiv id = “f81b7a4441″>
)。これは暗黙的なキャストと呼ばれます。
一方、次のように記述した場合
MountainBike myBike = obj;
obj
がコンパイラにMountainBike
であることが認識されていないため、コンパイル時エラーが発生します。ただし、明示的なキャストによってMountainBike
をobj
に割り当てることを約束していることをコンパイラに伝えることができます。
MountainBike myBike = (MountainBike)obj;
このキャストは、obj
にMountainBike
を使用すると、コンパイラはobj
がMountainBike
であると安全に想定できます。 obj
が実行時にMountainBike
でない場合、例外がスローされます。
instanceof
演算子を使用して、特定のオブジェクトのタイプに関する論理テスト。これにより、不適切なキャストによるランタイムエラーからあなたを救うことができます。例:
if (obj instanceof MountainBike) { MountainBike myBike = (MountainBike)obj;}
ここで、instanceof
演算子はobj
はMountainBike
を参照しているため、実行時の例外がスローされないことを認識してキャストを作成できます。