継承の特徴
単一継承: 各サブクラスは直接の親クラスを 1 つだけ持ちます。間接的な親クラスの数は制限されません。
親クラスの概念に注意してください。 -->B-->C-->D、ここで、ABCはDの親クラス、CはDの直接の親クラス、ABはDの間接的な親クラスです
サブクラスは一般および特殊です。 親クラスは特殊な親クラスです。クラスを定義するときに、親クラスが直接指定されていない場合は、オブジェクト クラスが継承されます。デフォルトでは、子クラスは親クラスから継承します。継承される要素は
サブクラスは親クラスのコンストラクターメソッドを継承しませんが、常に親クラスのコンストラクターメソッドを呼び出します
サブクラスはインスタンス変数を継承します。もちろん、親クラスのインスタンスメソッド、クラス変数、クラスメソッドは、Modified by private
親クラスのprivateで変更されたメンバーがサブクラスに継承されないことが前提です
finalで変更されたメソッド。親クラスのメソッドはサブクラスでオーバーライドできません
メソッドのオーバーライド
サブクラスと親クラスが所有する同じメソッドのシグネチャは、親クラスのメソッドをオーバーライドするサブクラスと呼ばれます
同じものが2つ、小さいものが2つ、 1 つの大きな原則:
2 つの同じ: メソッド名が同じ、仮パラメータのリストが同じ
2 つの小さな原則: サブクラスのメソッドの戻り値が親クラスの例外と同じかそれより小さい。サブクラスのメソッドは親クラスのメソッドと同じかそれより小さい必要があります。大きな例外として、サブクラスのメソッドのアクセス権は親クラスの静的アクセス権と同じかそれより大きくなければなりません。サブクラスのメソッドは親クラスのメソッドと一致している必要があります。メソッドが書き換えられた後、サブクラス オブジェクトは親クラス メソッドにアクセスできなくなりますが、サブクラス メソッド内で呼び出すことができます。 super. インスタンス メソッド、親クラス名。クラス メソッド
親クラスのメソッドがプライベートに変更された場合、サブクラスに親クラスのプライベート メソッドと同じシグネチャを持つメソッドがある場合、サブクラスはそのメソッドをオーバーライドできません。 、これはサブクラスの新しく追加されたメソッドであり、親クラスとは何の関係もありません。親クラスのメソッドで変更されたメソッドは、サブクラスでオーバーライドできません。 super キーワード
サブクラスでは、親クラスのインスタンス変数またはインスタンス メソッドを呼び出すために super キーワードを使用します
これと同じように、super と static を同時にメソッドを変更するために使用することはできません。また、static は同時にメソッドを変更することはできません。同時に
サブクラスは親クラスから変数を継承し、同じ名前の別の変数を定義するこのとき、super.変数名または親クラス名.変数名を使用して親クラスの変数にアクセスできます
。変数の検索順序
呼び出し元を明示的に指定せずにサブクラスメソッドが変数にアクセスする場合、次の順序で検索します:
現在のメソッドに同じ名前のローカル変数はありますか?
メンバー変数はありますか?現在のクラスに同じ名前を持つ
直接の親クラスには、オンラインで段階的に追跡できる
ありますか? 最終的に見つからない場合は、コンパイルエラーが発生します
親クラスのコンストラクターをスーパー呼び出しします
サブクラスは親クラスのコンストラクターを継承しませんが、常に親クラスのコンストラクターを呼び出します。同じクラスのコンストラクターを呼び出すにはこれを使用し、親クラスを呼び出すには super
明示的呼び出しを使用します。スーパー呼び出しステートメントはコンストラクター メソッドの最初の行に記述されます。これも最初の行に記述する必要があるためです。行なので、super と this は同時に表示されません
間接呼び出し: サブクラス メソッドの最初の行は this であり、呼び出されるコンストラクターは親クラスのコンストラクターも呼び出す必要があります
暗黙的な呼び出し: スーパーなし、なしこれにより、システムはデフォルトで親クラスのコンストラクターを呼び出すようになります
サブクラスは親クラスを継承し、親クラスのコンストラクターは、Object が呼び出されるまで常にレベルごとに呼び出され、最上位の親クラスのコンストラクターが見つかった後に開始されますレイヤーごとに実行を実行します
たとえば、次のコード、継承関係: A-->B-->C-->D
public class Test{ public static void main(String[] args) { D d=new D(); } } class D extends C{ D(){ System.out.println("D类构造器"); } }class C extends B{ C(){ System.out.println("C类构造器"); } }class B extends A{ B(){ System.out.println("B类构造器"); } }class A{ A(){ System.out.println("A类构造器"); } }
出力:
A クラス コンストラクター
B クラス コンストラクターC クラスのコンストラクター
D クラスのコンストラクター親クラスにパラメーターのないコンストラクターがなく、サブクラスが親クラスのパラメーターのないコンストラクターを呼び出す必要がある場合、コンパイルできませんポリモーフィズム簡単に言えば、ポリモーフィズムは次のとおりです。ピラミッド型の継承システム。最下位のサブクラス オブジェクトを作成するときは、最上位の親クラスの型を使用して、これらの最下位のサブクラス オブジェクトを参照します。同じメソッドが同じ型の参照変数を通じて呼び出される場合、異なる結果が表示されます。 : 継承 + 親型 参照はサブタイプのオブジェクト + メソッドのオーバーライドを指します 参照変数には 2 つの型があり、1 つはコンパイル時型、もう 1 つは実行時型です アップキャスト: 親型参照はサブタイプ オブジェクトを指しており、上方変換はシステムによって自動的に完了します
上方変換の場合: 親タイプの参照を通じてサブクラスのオーバーライドされたメソッドを呼び出すことができますが、インスタンス変数にはアクセスできません親クラスにはサブクラスには存在しないものがあります。これは、インスタンス変数に多態性がないことを意味します
instanceof と強制的な型変換
基本型には、(double)16 などの強制的な型変換があります。型変換
たとえば、次のような継承チェーンがあります: A-->B-->C--> ;D-->E-->F, B b=new D()。今回は、B 型を使用して D オブジェクトを指します。このとき、b 変数は ACD 型に変換できますが、EF 型には変換できません。ClassCastException が発生します。
強制的な型変換を実行する前に、まず、instanceof を使用して、例外のスローを回避するために変換を実行できるかどうかを判断する必要があります。
X 変数 instanceof Y 型: X 変数を Y 型に変換できるかどうかを判断する: 次の 3 つの状況が考えられます。
true は、yes を意味します。 回転することは、 X 変数が指すオブジェクトの型が Y 型と親子関係や子父関係を持たないことを意味します。 どちらも、 のサブタイプです。
継承はコードの再利用を実現できますが、カプセル化の破棄の組み合わせでもコードの再利用を実現できます
親クラスを設計する際に従うべき原則:
親クラスの内部データを隠し、サブクラスによる直接アクセスを防ぐためにプライベートを使用するようにしてください。親クラスのメンバー変数
サブクラスが親クラスのメソッドに自由にアクセスしたり変更したりすることを許可しないでください。親クラスの補助ツールのメソッドは private で修飾され、外部から呼び出す必要があるメソッドは public で修飾され、サブクラスによって書き換えられる必要がある場合は、final で修飾されます。ただし、外部アクセスを望まない場合は、protected を使用してください
いいえ、親クラスのコンストラクターでサブクラスによってオーバーライドされる可能性のあるメソッドを呼び出すと、深刻な結果が生じます
設計継承の原則:
サブクラスは、属性の変更ではなく、追加の属性を追加する必要があります
サブクラスは独自の独自の関数や動作を追加する必要があります。新しいメソッドを追加したり、親クラスのメソッドをオーバーライドしたりできます
コードの再利用だけを目的として継承を設計するのではなく、親クラスかどうかにかかわらず、実際の状況を見てください。とサブクラスには「has-a」関係があります
クラスを継承しないでください:
final: 最終クラスとして Final を使用してクラスを変更します。継承することはできません
private: クラスのすべてのコンストラクターを変更しますまた、クラス A のコードを再利用することもできます。このクラスのコンストラクターを継承することはできません。クラス A にクラス B のオブジェクトを作成し、プライベート変更を使用します
クラス A メソッドでクラス B オブジェクトのメソッドを呼び出します
組み合わせまたは継承:
継承: サブクラスと親クラスは「is-a」関係を持ちます。 、具体と抽象、特殊と一般の関係
組み合わせ: 新しいクラスと古いクラスは「ある」関係、全体と部分の関係
その他:
サブクラスは親クラスから変数を継承し、同じ名前の変数を定義します。サブクラスクラスのオブジェクト作成時に両方の変数にメモリが割り当てられますが、親クラスの変数は非表示になります