継承の特徴の1つは、サブクラスが親クラスのプライベートフィールドまたはプライベートメソッドにアクセスできないことです。たとえば、Student クラスはPerson クラスの名前フィールドと年齢フィールドにアクセスできません。
クラスPerson {
プライベート文字列名;
私有年齢;
}
クラスStudent extends Person {
public String hello(){
return "Hello、" + name; // コンパイルエラー:名前フィールドにアクセスできません
}
}
これにより、継承の役割が弱まります。サブクラスが親クラスのフィールドにアクセスできるようにするには、private をprotected に変更する必要があります。フィールドは変更して保護サブクラスによってアクセスすることができます。
クラスPerson {
保護された文字列名;
保護された年齢;
}
クラスStudent extends Person {
public String hello(){
return "Hello、" + name; // OK!
}
}
したがって、protected キーワードは、継承ツリー内のフィールドとメソッドのアクセス許可を制御できます。保護されたフィールドとメソッドは、そのサブクラスとサブクラスのサブクラスからアクセスできます。詳細については後で説明します。
2.スーパーの使用
super キーワードは、親クラス(スーパークラス)を表します。サブクラスが親クラスのフィールドを参照する場合、super.fieldName を使用できます。例えば:
クラスStudent extends Person {
public String hello(){
return "Hello、" + super .name;
}
}
上記のコードを実行すると、コンパイルエラーが発生し、スチューデント構築メソッドが呼び出され、Person構築メソッドを呼び出すことができません。
分析:クラス構築メソッドは、最初に親クラス構築メソッドを構築する必要があります。親クラスの構築メソッドが明示的に呼び出されない場合、コンパイラーは自動的にsuper()を追加するため、Studentクラスの構築メソッドは実際には次のようになります
次に、問題は、親クラスであるPersonクラスにデフォルトのコンストラクターがなく、サブクラスであるStudentがオーバーロードを呼び出した後にコンストラクターを表示する必要があることです。
Studentクラスの記述は
アップロードしています... 再アップロードがキャンセルされました
概要:親クラスにデフォルトの構築メソッドがない場合、サブクラスは明示的にsuper()を呼び出し、パラメーターを指定して、コンパイラーが適切な構築メソッドを見つけられるようにする必要があります。同時に、サブクラスは親クラスの構築メソッドを継承しません。サブクラスのデフォルトの構築メソッドは、継承されずにコンパイラによって自動的に生成されます