目次
継承する
すべてのOOP言語には 3 つの特徴があります。
なぜ継承があるのでしょうか?まず次の例を見てください。
上記 2 つのクラスのコードは、最後のメソッドだけが異なり、他は同じなのでよく似ていますが、この定義はコードの冗長性を招くだけでなく、非常に面倒です。OOP 言語では、継承は特に共通点の抽出とコードの再利用に使用されます。
継承 (継承) メカニズム:コードを再利用可能にするオブジェクト指向プログラミングの最も重要な手段であり、プログラマが元のクラスの特性を維持したまま新しい機能を拡張および追加することにより、派生と呼ばれる新しいクラスを生成することができます。親切。継承はオブジェクト指向プログラミングの階層構造を表し、単純なものから複雑なものまでの認知プロセスを反映します。継承によって解決される主な問題は、共通性の抽出とコードの再利用の実現です。
JAVA で継承を実現するには、 extendsキーワードを使用する必要があります。
修飾子クラスのサブクラスは親クラスを拡張します { // ... }
この時点では、次の例を見ています。教師と生徒は人々という大きなカテゴリに属しているため、同じ属性とメソッドをまとめるために People クラスを個別に定義できます。その後、生徒クラスと教師クラスがこれを継承します。カテゴリ:
class People{
public String name;
public int age;
public void speak(){
System.out.println(this.name+"正在说话");
}
}
class Teacher extends People{
public void work(){
System.out.println(this.name+"正在教书");
}
}
class Student extends People{
public void study(){
System.out.println(this.name+"正在学习");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.age = 24;
teacher.speak();
teacher.work();
System.out.println("==========");
Student student = new Student();
student.name = "xiaoming";
student.age = 15;
student.speak();
student.study();
}
}
注:サブクラスは、親クラスのメンバー変数またはメンバー メソッドをサブクラスに継承します。
そこで新たな疑問が生じます。サブクラスが親クラスと同じプロパティまたはメソッドを持っている場合、システムはどうするでしょうか?
class People{
public String name;
public int age = 25;
public void speak(){
System.out.println(this.name+"正在说话");
}
}
class Teacher extends People{
public int age = 20;
public void work(){
System.out.println(this.name+"正在教书"+"今年"+this.age);
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.work();
}
}
このとき、親クラスとサブクラスの両方に age 属性が設定されており、コードを実行するとサブクラスの属性が使用されていることがわかります。
要約:
- サブクラス オブジェクトを介して親クラスとサブクラスのプロパティにアクセスする場合、最初に独自のプロパティにアクセスし、それがない場合は親クラスで探し、プロパティにない場合はエラーを報告します。親クラス。
- サブクラス オブジェクトを通じて親クラスとサブクラスの異なる名前のメソッドにアクセスする場合は、まずサブクラスでそのメソッドを探し、見つかった場合はアクセスします。それ以外の場合は親クラスで探し、見つかった場合はアクセスします。見つけられない場合は、コンパイルしてエラーを報告します。
- サブクラスオブジェクトを通じて親クラスとサブクラスの同名のメソッドにアクセスする際、親クラスとサブクラスの同名のメソッドのパラメータリストが異なる場合(オーバーロード)、適切なメソッドを選択してアクセスする呼び出しメソッドによって渡されたパラメータに従って、何もない場合はエラーを報告します。
親クラスにプライベートの変更された属性またはメソッドがある場合でも、サブクラスはそれを継承しますが、アクセスすることはできません。
素晴らしい
上の例では、新しいキーワード super が表示されます。では、スーパーキーワードは何をするのでしょうか?
このキーワードの主な機能は、サブクラスのメソッド内の親クラスのメンバーにアクセスすることです。
class People{
public String name;
public int age = 25;
public void speak(){
System.out.println(this.name+"正在说话");
}
}
class Teacher extends People{
public int age = 20;
public void work(){
System.out.println(this.name+"正在教书"+"今年"+super.age);
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.work();
}
}
親クラスとサブクラスの両方に age 属性があるため、親クラスのプロパティにアクセスする場合は、super キーワード super+. を使用して、親クラスのプロパティとメソッドにアクセスできます。(スーパーを使用する 3 番目の方法は後で紹介します)。
サブクラスコンストラクター
このとき、親クラスにパラメータを持つコンストラクタがある場合、システムはエラーを報告します。
2 つのパラメーターを持つコンストラクターが親クラスに追加されると、コードはエラーを報告します。
次に、super キーワードを使用する 3 番目の方法を紹介します。
素晴らしい();
親クラスのコンストラクターを呼び出すことができます。
注: コンストラクターの最初の行に配置する必要があります。
オブジェクトをインスタンス化する際には、さらに 2 つの重要な手順があるためです。
- オブジェクトにメモリを割り当てます。
- 適切なコンストラクターを呼び出します。
パラメーターを使用してコンストラクターを作成した後で上記のコードがエラーを報告した理由は、サブクラスのコンストラクターが親クラスのコンストラクターを呼び出していないためです。(構築メソッドを自分で作成すると、システムは構築メソッドを提供しなくなり、サブクラス オブジェクトを構築するときに、最初に親クラスの構築メソッドを呼び出してから、サブクラスの構築メソッドを実行する必要があります。構築メソッドメソッドを記述しないでください。システムはデフォルトで次の構築メソッドを呼び出します: 、パラメータを使用して構築を記述しただけなので、システムはパラメータのない構築を見つけることができないためエラーを報告し、それを呼び出す必要があります。私たち自身:)
サブクラス オブジェクトのメンバーは、基本クラスの継承部分とサブクラスの新しく追加された部分の 2 つの部分で構成されます。父と息子には、最初に父、次に息子が必要であるため、サブクラス オブジェクトを構築するときは、まず基本クラスの構築メソッドを呼び出して、基本クラスから継承されたメンバーの構築を完了してから、サブクラス自体の構築メソッドを呼び出します。これにより、サブクラスの新しく追加されたメンバーが完全に初期化されます。
知らせ:
- 親クラスが引数なしまたはデフォルトの構築メソッドを明示的に定義している場合、デフォルトでサブクラス構築メソッドの最初の行に暗黙的な super() 呼び出しが存在します。つまり、基本クラス構築メソッドが呼び出されます。
- 親クラス構築メソッドにパラメータがある場合、ユーザーはサブクラスの構築メソッドを明示的に定義し、サブクラス構築メソッドで適切な親クラス構築メソッド呼び出しを選択する必要があります。そうしないとコンパイルが失敗します。
- サブクラス構築メソッドでは、super(...) が親クラス構築を呼び出すとき、それがサブクラス コンストラクターの最初のステートメントである必要があります。
- super(...) はサブクラス コンストラクター内で 1 回のみ出現でき、これと同時に出現することはできません。
最後の
JAVA では次の継承メソッドのみがサポートされています。
- 単一継承。
- マルチレベルの継承。
- 異なるクラスは同じクラスを継承します。
一般に、継承レベルが 3 つを超えることは望ましくありませんが、継承レベルが多すぎて複雑すぎる場合は、コードのリファクタリングを検討する必要があります。
では、他人が相続するのをどうやって止めるべきでしょうか?
JAVA は、変数、メンバー メソッド、およびクラスを変更するために使用できる最終キーを提供します。
- 定数を表す変更された変数またはフィールド (つまり、変更できません)
- 変更されたクラス: このクラスが継承できないことを示します
- 変更されたメソッド: メソッドをオーバーライドできないことを示します
継承したくないクラスの前で最終的な変更を行う必要があるだけです。