(参考書:Java2実践チュートリアル第5版)
1つ、サブクラスと親クラス
継承は、既存のクラスから新しいクラスを作成するためのメカニズムです。継承を使用すると、最初に共通の属性を持つ一般クラスを定義できます。一般クラスに従って、特別な属性を持つサブクラスを定義します。サブクラスは一般クラスの属性と動作を継承し、必要に応じて独自の新しい属性と動作を追加します。継承されたクラスは子クラスと呼ばれ、継承されたクラスは親クラス(スーパークラス)と呼ばれます。Javaは多重継承をサポートしていません。つまり、サブクラスは1つの親クラスしか持つことができません。
第二に、サブカテゴリーの定義
キーワードextendsを使用して、クラスのサブクラスを定義します。形式は次のとおりです。
class 子类名 extends 父类名{
...;
}
3、クラスツリー構造
Javaのすべてのクラスの祖先は、Objectクラスです。各クラス(Objectクラスを除く)には1つだけの親クラスがありますが、0個以上のサブクラスが存在する場合があります。クラス宣言にextendsキーワードがない場合、そのクラスはシステムによってObjectクラスのサブクラスと見なされます。つまり、宣言「クラスA」と「クラスAはオブジェクトを拡張します」は同じです。
第四に、サブクラスの継承
(1)サブクラスと親クラスが同じパッケージ内にある場合、サブクラスは親クラスでプライベートではない変数とメソッドを自然に継承し、継承されたメンバー変数とメソッドのアクセス権は変更されません。
(2)サブクラスと親クラスが同じパッケージにない場合、サブクラスはプライベートでフレンドリなメンバー変数とメソッドを継承せず、共有および保護されたメンバー変数とメソッドのみを継承します。
5、サブクラスのオブジェクト
サブクラスの構築メソッドを使用してオブジェクトを作成すると、サブクラスで宣言されたメンバー変数にメモリスペースが割り当てられるだけでなく、親クラスのサブクラスに継承されたメンバー変数にもメモリスペースが割り当てられます。
6、instanceof演算子
二項演算子の場合、オブジェクトは左側にあり、クラスは右側にあります。左側のオブジェクトが右側のクラスまたはそのサブクラスによって作成されたオブジェクトである場合、戻り値はtrueです。それ以外の場合はfalseです。
7、メンバー変数の非表示とメソッドの書き換え
(1)メンバー変数の非表示
サブクラスで宣言されたメンバー変数が親クラスから継承されたメンバー変数と同じ名前の場合、サブクラスは継承されたメンバー変数を非表示にします。サブクラスに継承されるメンバー変数の特徴は次のとおりです。
- 親クラスと同じ名前のメンバー変数を操作する、サブクラス自体によって定義されたサブクラスオブジェクトとメソッドは、サブクラスによって再宣言されたメンバー変数を参照します。
- サブクラスオブジェクトは、親クラスから継承されたメソッドを呼び出して、サブクラスによって非表示にされたメンバー変数を操作できます。つまり、サブクラスによって継承されたメソッドによって操作されるメンバー変数は、サブクラスによって継承または非表示にされたメンバー変数である必要があります。
- サブクラスの新しく定義されたメソッドは、サブクラスの非表示のメンバー変数を操作できません(superキーワードを使用する必要があります)
(2)メソッドの書き換え
- 文法規則:サブクラスが親クラスの特定のメソッドを継承できる場合、サブクラスにはこのメソッドをオーバーライドする権利があります。いわゆるメソッド書き換えとは、サブクラス内のメソッドの定義を指します。このメソッドのタイプは、親クラスのメソッドのタイプまたは親クラスのメソッドのサブタイプ、およびの名前と一致します。メソッド、パラメーターの数、およびパラメーターのタイプメソッドは親クラスとまったく同じです。
- 書き換えの目的:サブクラスはメソッドの書き換えによって継承されたメソッドを非表示にでき、サブクラスはメソッドの書き換えによって親クラスの状態と動作を独自の状態と動作に変更できます。オーバーライドされたメソッドは、継承されたメンバー変数とメソッドだけでなく、新しく宣言されたメンバー変数とサブクラスによって定義された新しいメソッドも操作できます。ただし、サブクラスによって隠されているメンバー変数とメソッドは操作できません。
- オーバーライドに関する注意:親クラスのメソッドをオーバーライドする場合、メソッドのアクセス権限を減らすことはできませんが、アクセス権限を増やすことはできます。(権限の順序:パブリック>保護>フレンドリー>プライベート)
8つのスーパーキーワード
(1)superキーワードの役割と使用法:
サブクラスが継承されたメンバー変数またはメソッドを非表示にすると、サブクラスによって作成されたオブジェクトは変数またはメソッドを所有しなくなり、変数はキーワードsuperによって所有されます。次のように:
super.x//操作被隐藏的成员变量x
super.play()//调用被隐藏的方法
(2)superキーワードを使用して、親クラスの構築メソッドを呼び出します。
サブクラスの構築メソッドがサブクラスのオブジェクトを作成する場合、サブクラスの構築メソッドは常に最初に親クラスの特定の構築メソッドを呼び出します。使用する親クラスのコンストラクターを明確に指定しない場合は、パラメーターなしで親クラスを呼び出します。
サブクラスは親クラスの構築メソッドを継承できないため、サブクラスの構築メソッドを作成するときは、superキーワードを使用して親クラスの構築メソッドを呼び出す必要があり、superは構築メソッドの最初の文である必要があります。サブクラスの。superステートメントを記述しない場合、デフォルトは次のとおりですsuper ();
。Javaのパラメーターなしコンストラクターにより、親クラスで複数のコンストラクターが定義されている場合、サブクラスがsuperを省略した場合のエラーを防ぐために、パラメーターなしのコンストラクターを含める必要があります。
class 父类{
父类(构造方法){
...;
}
...;
}
class 子类 extends 父类{
子类(构造参数){
super(构造参数); //父类的构造方法
...; //构造方法
}
}
9つの最後のキーワード
finalキーワードは、クラス、メンバー変数、およびメソッドのローカル変数を変更できます。
(1)finalクラスfinalクラス
はfinalで宣言でき、finalは継承できません。次のように:
final class A{
...;
}
(2)finalメソッド
親クラスのメソッドがfinalで変更された場合、このメソッドをサブクラスで書き換えることはできません。(正直に継承し、改ざんは許可されていません)
(3)最終定数
finalで変更されたメンバー変数とローカル変数は定数であり、宣言時に特定の値を指定する必要があります。
10.オブジェクトのアップトランスフォーメーション
親クラスオブジェクトとサブクラスオブジェクトを定義します。サブクラスオブジェクトの参照を親クラスオブジェクトに入れると、親クラスオブジェクトはサブクラスオブジェクトの上位変換オブジェクトと呼ばれます。次の特徴があります。
- 上位の変換オブジェクトは、サブクラスの新しいメンバー変数を操作できず(属性のこの部分が失われます)、サブクラスの新しいメソッドを呼び出すことができません(一部の動作が失われます)。
- 上位の変換オブジェクトは、サブクラスによって継承または非表示になっているメンバー変数とメソッドにアクセスします。サブクラスが親クラスのインスタンスメソッドを書き換える場合、上位の変換オブジェクトがこのメソッドを呼び出すときに、サブクラスの書き換えられたインスタンスメソッドを呼び出す必要があります。
- サブクラスが親クラスのクラスメソッドをオーバーライドする場合、サブクラスオブジェクトの上位キャストオブジェクトは、サブクラスによって書き換えられたクラスメソッドを呼び出すことができません。親クラスのメソッドのみを呼び出します。
- 親クラスによって作成されたオブジェクト!=サブクラスオブジェクトのアップキャストオブジェクト
11、抽象クラスと抽象メソッド
キーワードabstractで変更されたクラスとメソッドは、抽象クラスと抽象メソッドと呼ばれます。抽象メソッドの場合、宣言することはできますが、実装することはできません(つまり、メソッド本体はありません)。また、finalとabstractを使用して同じメソッドまたはクラスを変更することはできません。また、staticを使用して抽象メソッドを変更することもできません。つまり、抽象メソッドはインスタンスメソッドである必要があります。
- 抽象クラスは、抽象メソッドを持つことも、抽象メソッドを持たないこともできます。ただし、非抽象クラスは抽象メソッドを持つことはできません。
- 抽象クラスは、new演算子を使用してオブジェクトを作成できません。非抽象クラスが抽象クラスのサブクラスである場合、親クラスの抽象メソッドをオーバーライドし、メソッド本体を指定する必要があります。抽象クラスが別の抽象クラスのサブクラスである場合、親クラスの抽象メソッドをオーバーライドするか、親クラスの抽象メソッドを継承することができます。
- 抽象クラスを使用してオブジェクトを宣言できます。new演算子を使用してオブジェクトを作成することはできませんが、オブジェクトをそのサブクラスのアップキャストオブジェクトにして、オブジェクトがサブクラスオーバーライドメソッドを呼び出すことができるようにすることができます。