継承
前のレッスンでは、継承について何度か言及しました。 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を参照しているため、実行時の例外がスローされないことを認識してキャストを作成できます。