継承する
相続の定義
クラスとクラスの間には関係があり、この関係はアソシエーションと呼ばれます。たとえば、デパート クラスと販売員クラスは関連付けであり、学生クラスと教師クラスも関連付けです。2 つのクラスの間には多くの関係 (依存関係、合成など) があり、継承はそのうちの 1 つにすぎません。
-
継承の本質は、現実世界のより適切なモデリングを実現するために、特定のクラスを抽象化することです。
-
継承関係の 2 つのクラス、1 つはサブクラス (派生クラス)、もう 1 つは親クラス (基底クラス、スーパークラス) です。サブクラスは親クラスを継承し、キーワードextends は
extends が「拡張」を意味し、サブクラスが親クラスの拡張であることを示すために使用されます。
親クラス(全サブクラス)の共通点抽出
public class Zi extends Fu{
//内容
}
受け継がれた注意
- クラス間の継承は単一のみであり、多重継承はありません。!!
人に生物学的な父親が 1 人しかいないのと同じように、サブクラスは 1 つの親クラスからのみ「直接」継承できます。
また、父親が複数の子を持つことができるのと同じように、親クラスは複数のサブクラスを持つことができます。
- 親クラスのプロパティとメソッドはサブクラスに継承でき、サブクラスは独自の排他的なコンテンツを持つこともできます。
- 親とサブクラスの継承関係では、メンバー変数が同じ名前である場合、サブクラス オブジェクトの作成時にそれにアクセスする方法が 2 つあります:
a. サブクラス オブジェクトを通じてメンバー変数に直接アクセスします:
等しいものの左側にあるもの記号が最初に使用され、記号がない場合は調べます。
b. メンバー メソッドを通じて間接的に (メソッド内で) メンバー変数にアクセスします:メソッドが属している
人、最初に使用する人、そうでない場合は検索します。 - 親クラスと子クラスの継承関係において、親クラスと同じ名前のサブクラスオブジェクトを作成する場合、その所有者は誰であっても、サブクラスがない場合は親クラスを参照し、サブクラスを参照することはありません。
スーパーキーワード
サブクラスが親クラスを継承した後、サブクラスで this を使用してアクセスを示すか、サブクラスのプロパティまたはメソッドを呼び出すことができます。また、super を使用してアクセスを示すか、親クラスのプロパティやメソッドを呼び出すことができます。
スーパーの使い方
- 親クラスのプロパティにアクセスする
public class Fu {
String name="xxx";
}
public class Zi extends Fu{
String name ="yyy";
public void showname()
{
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
- 親クラスのメソッドにアクセスする
public class Fu {
public void show()
{
System.out.println("唱唱歌");
}
}
public class Zi extends Fu{
public void show()
{
System.out.println("跳跳舞");
}
public void show_together()
{
show();
this.show();
super.show();
}
}
- 親クラスでコンストラクターを呼び出す
public class Fu {
}
public class Zi extends Fu{
//编译通过,编译器会赠送一个无参构造
//super();
public Zi(){
}
}
//一定是先调用父类构造,后执行子类构造
予防
- super を使用して親クラスのコンストラクターを呼び出す場合は、コンストラクターの最初のステートメントにする必要があります。
- super はサブクラスのメソッドまたはコンストラクター内でのみ使用できます。
- super と this を同時にコンストラクターを呼び出すことはできません。(これはコンストラクターの最初のステートメントでもあるため)
スーパーとこれの違い
- 物事が違うことを表す
this: 属するメソッドの呼び出し元オブジェクトを表します
super: 親クラス オブジェクトのアプリケーション空間を表します
- 使用前提が違う
this: 非継承前提でも使用可能
super: 継承前提でのみ使用可能
- 呼び出しコンストラクター
this: このクラスのコンストラクターを呼び出します。
super: 親クラスのコンストラクターを呼び出します。
メソッドのオーバーライド
オーバーライド
なぜ書き直すのでしょうか?
サブクラスは親クラスを継承し、親クラスのメソッドを継承しますが、親クラスのメソッドが必ずしもサブクラスの機能ニーズを満たしているとは限らないため、サブクラスでメソッドを書き直す必要があります。
- 継承関係ではメソッド名は同じであり、パラメータリストも同じです。別名: カバー、上書き
- メソッドの書き換えは、サブクラスと親クラス (直接の親クラスと間接的な親クラスを含む) の間でのみ存在します。同じクラス内のメソッドはオーバーロードのみ可能であり、オーバーライドはできません。
- 静的メソッドはオーバーライドできません
a. 親クラスの静的メソッドをサブクラスで非静的メソッドとして書き換えることはできず、コンパイル エラーが発生します b.
親クラスの非静的メソッドをサブクラスで静的メソッドとして書き換えることはできません、およびc.コンパイルエラーが発生します
c. サブクラスは親クラスと同じものを定義できます 静的メソッドと同じ名前の静的メソッド (ただし、これは対象外です。プライベート メソッドはサブクラスによってオーバーライドできません。サブクラスが親クラスを継承した後、プライベート メソッドは、親クラスを継承した後
、書き換えはおろか、親クラスのプライベート メソッドに直接アクセスすることもできません。
//编译通过
//只是两个类自己的私有方法
public class Fu {
private void show() {
}
}
public class Zi extends Fu{
private void show() {
}
}
オーバーライドされた構文
- メソッド名は同じである必要があります
- 引数リストは同一でなければなりません
- アクセス制御修飾子は拡張できますが、狭めることはできません
public > protected > default > private
スコープ:
public----
保護できる場所ならどこでも----同じパッケージ/サブクラス (サブクラスは異なるパッケージの下にあることも可能)
デフォルト-同じパッケージ
private-----同じクラス
注: 一般に、書き換えられたメソッドは親クラスのメソッドの宣言と完全に一致しますが、メソッドの実装のみが異なります。(つまり、中括弧内のコードが異なります)
- @オーバーライド: 書き換えコードの前に記述され、書き換えが有効で正しいかどうかを検出するために使用されます。
- スローされる例外タイプの範囲は狭めることはできますが、広げることはできません。
ClassNotFoundException --> 例外 - 戻り値の型は同じでも異なっていても構いません。異なる場合、サブクラスによって書き換えられるメソッドの戻り値の型は、親メソッドの戻り値の型のサブタイプである必要があります。
例: 親メソッドの戻り値の型は Person です、およびサブクラスの戻り値の型を書き換えます。 クラスは、パーソンまたはパーソンのサブタイプのいずれかになります。