Javaベース-継承(Extends)
3766 ワード
extends(継承)を使用するメリットは何ですか?
継承を使用すると、コードの再利用が可能になります.継承により、子クラスは親クラスのメンバー変数とメンバーメソッドを継承し、子クラスは独自のメンバー変数とメンバーメソッドを定義できます.その場合、子クラスには親クラスのメンバーと本クラスのメンバーがあります.Java言語では多重継承はサポートされません.つまり、1つのクラスは1つの親クラスしか継承できませんが、1つの親には複数の子クラスがあります.
コードの説明:親Fatherを宣言し、共通情報を配置し、無パラメトリック構築関数を宣言し、メンバー変数Cell配列をインスタンス化します.サブクラスSonがFatherを継承することを宣言し、パラメトリック関数、行row、列colパラメータを渡すことを宣言します.次にmainメソッドで、T型オブジェクトを宣言します.つまり、T型オブジェクトの構築を実現できます.
サブクラスオブジェクトの作成時に、サブクラスのパラメトリック関数を呼び出してデータの初期化を行いますが、親Fatherのパラメトリック関数は実行されますか?(これは継承の理解にとって特に重要です)--親クラスの無パラメトリック構造関数が実行されたことをクエリーで知ります.
親のコンストラクション関数はプログラムに宣言されていませんが、どのように実行されますか.-親クラスの無パラメトリック構築方法が実行されるのはjavaが、子クラスが構築する前に親クラスを構築しなければならないことを規定しているからである.
また、実際には、サブクラスの構築方法ではsuperキーワードで親クラスの構築方法を呼び出す必要があります.これにより、親クラスから継承されたメンバー変数を適切に初期化することが保証されます.
前の例では、コードにsuperが親構造メソッドを呼び出さなかったのは、子クラスの構造メソッドに親の構造メソッドが呼び出されていない場合、javaコンパイラが親の非参照構造メソッドの呼び出しを自動的に追加するためです.次のコードを参照して、superキーワードの使い方を説明します.
上のコードではsuper();コンパイラが自動的に追加される場合は、---superキーワードがサブクラス構築メソッドの最初の行にある必要があります.そうしないと、コンパイルエラーが発生します.
もう1つ注意したいのは、親が無参の構造方法を提供していない場合、コンパイルエラーが発生することです.
結論:サブクラス構築メソッドにsuper呼び出し親構築メソッドが書かれていない場合、コンパイラはデフォルトでsuper()を追加して親の無パラメトリック構築メソッドを呼び出しますが、親に無パラメトリック構築メソッドが定義されていない場合、コンパイルエラーが発生します.
解決策:(1)親にパラメータなしのコンストラクションメソッドを追加(2)子コンストラクションメソッドに親を呼び出すパラメータ付きコンストラクションメソッドを表示(推奨)
superキーワードの役割のまとめ:1:主にサブクラスメソッドに存在し、サブクラスオブジェクトの親オブジェクトを指すために使用されます.2:親にアクセスするプロパティ3:親にアクセスする関数4:親にアクセスするコンストラクション関数thisとsuper==thisは現在のオブジェクトの呼び出しを指し、superは現在の呼び出しオブジェクトの親を指します.クラスのロードが完了すると、オブジェクトが作成され、親の構築方法が呼び出されます(デフォルトでは自動的にパラメータがありません)、サブクラスの対応する構築を実行して、親オブジェクトを含むサブクラスオブジェクトが作成されます.親オブジェクトは子オブジェクトの内部にあります.thisとsuperはオブジェクトがある場合にのみ使用でき、静的コンテキストでは使用できません.
二、継承の意味(書き換え)java言語では、サブクラスは親から継承されたメソッドを書き換える(上書きする)ことができ、すなわち、メソッド名とパラメータリストは親のメソッドと同じであるが、メソッドの実装は異なる.
子クラスが親クラスのメソッドを書き換えた後、その書き換えメソッドが呼び出されると(子クラスの参照呼び出しによっても親クラスの参照呼び出しによっても)、実行されるのは子クラスの書き換え後のバージョンです.次のコードを参照してください.
出力結果:いずれも「Goo.f()」であり、いずれもGooのオブジェクトであるため、サブクラスの参照でも親クラスの参照でも最終的に実行されるのはサブクラス書き換え後のバージョンである.では、親バージョンはどのように使うのでしょうか.サブクラスの書き換え方法では、superキーを使用して親クラスのバージョンを呼び出すことができます.次の項を参照してください.
出力結果:Foo.f() Goo.f(). super.f()は親Fooのf()メソッドを呼び出すことができ,このような構文は通常,子クラスの書き換えメソッドが親メソッドに基づいて行う機能拡張に用いられる.
継承された親子関係:子クラス親クラスのすべての属性と動作 子クラスは特殊な親 である.サブクラスオブジェクトは、親オブジェクトとして を使用できます.子クラスに親クラスにないメソッドと属性を追加できます
継承を使用すると、コードの再利用が可能になります.継承により、子クラスは親クラスのメンバー変数とメンバーメソッドを継承し、子クラスは独自のメンバー変数とメンバーメソッドを定義できます.その場合、子クラスには親クラスのメンバーと本クラスのメンバーがあります.Java言語では多重継承はサポートされません.つまり、1つのクラスは1つの親クラスしか継承できませんが、1つの親には複数の子クラスがあります.
public class Father{
Cell[] cells;
public Father() {
cells = new Cell[4];
}
public void drop() ;
public void moveLeft() ;
public void moveRight() ;
public void print() ;
}
public class Son extends Father{
public Son(int row, int col) {
cells[0] = new Cell(row, col);
cells[1] = new Cell(row, col + 1);
cells[2] = new Cell(row, col + 2);
cells[3] = new Cell(row + 1, col + 1);
}
}
コードの説明:親Fatherを宣言し、共通情報を配置し、無パラメトリック構築関数を宣言し、メンバー変数Cell配列をインスタンス化します.サブクラスSonがFatherを継承することを宣言し、パラメトリック関数、行row、列colパラメータを渡すことを宣言します.次にmainメソッドで、T型オブジェクトを宣言します.つまり、T型オブジェクトの構築を実現できます.
Son t = new Son( 1 , 1);
サブクラスオブジェクトの作成時に、サブクラスのパラメトリック関数を呼び出してデータの初期化を行いますが、親Fatherのパラメトリック関数は実行されますか?(これは継承の理解にとって特に重要です)--親クラスの無パラメトリック構造関数が実行されたことをクエリーで知ります.
親のコンストラクション関数はプログラムに宣言されていませんが、どのように実行されますか.-親クラスの無パラメトリック構築方法が実行されるのはjavaが、子クラスが構築する前に親クラスを構築しなければならないことを規定しているからである.
また、実際には、サブクラスの構築方法ではsuperキーワードで親クラスの構築方法を呼び出す必要があります.これにより、親クラスから継承されたメンバー変数を適切に初期化することが保証されます.
前の例では、コードにsuperが親構造メソッドを呼び出さなかったのは、子クラスの構造メソッドに親の構造メソッドが呼び出されていない場合、javaコンパイラが親の非参照構造メソッドの呼び出しを自動的に追加するためです.次のコードを参照して、superキーワードの使い方を説明します.
public Son(int row, int col) {
super ( ) ;
cells[0] = new Cell(row, col);
cells[1] = new Cell(row, col + 1);
……
}
上のコードではsuper();コンパイラが自動的に追加される場合は、---superキーワードがサブクラス構築メソッドの最初の行にある必要があります.そうしないと、コンパイルエラーが発生します.
もう1つ注意したいのは、親が無参の構造方法を提供していない場合、コンパイルエラーが発生することです.
結論:サブクラス構築メソッドにsuper呼び出し親構築メソッドが書かれていない場合、コンパイラはデフォルトでsuper()を追加して親の無パラメトリック構築メソッドを呼び出しますが、親に無パラメトリック構築メソッドが定義されていない場合、コンパイルエラーが発生します.
解決策:(1)親にパラメータなしのコンストラクションメソッドを追加(2)子コンストラクションメソッドに親を呼び出すパラメータ付きコンストラクションメソッドを表示(推奨)
superキーワードの役割のまとめ:1:主にサブクラスメソッドに存在し、サブクラスオブジェクトの親オブジェクトを指すために使用されます.2:親にアクセスするプロパティ3:親にアクセスする関数4:親にアクセスするコンストラクション関数thisとsuper==thisは現在のオブジェクトの呼び出しを指し、superは現在の呼び出しオブジェクトの親を指します.クラスのロードが完了すると、オブジェクトが作成され、親の構築方法が呼び出されます(デフォルトでは自動的にパラメータがありません)、サブクラスの対応する構築を実行して、親オブジェクトを含むサブクラスオブジェクトが作成されます.親オブジェクトは子オブジェクトの内部にあります.thisとsuperはオブジェクトがある場合にのみ使用でき、静的コンテキストでは使用できません.
二、継承の意味(書き換え)java言語では、サブクラスは親から継承されたメソッドを書き換える(上書きする)ことができ、すなわち、メソッド名とパラメータリストは親のメソッドと同じであるが、メソッドの実装は異なる.
子クラスが親クラスのメソッドを書き換えた後、その書き換えメソッドが呼び出されると(子クラスの参照呼び出しによっても親クラスの参照呼び出しによっても)、実行されるのは子クラスの書き換え後のバージョンです.次のコードを参照してください.
class Foo {
public void f() {
System.out.println("Foo.f()");
}
}
class Goo extends Foo {
public void f() {
System.out.println("Goo.f()");
}
}
class Test{
public static void main(String[] args){
Goo obj1 = new Goo();
obj1.f();
Foo obj2 = new Goo();
obj2.f();
}
}
出力結果:いずれも「Goo.f()」であり、いずれもGooのオブジェクトであるため、サブクラスの参照でも親クラスの参照でも最終的に実行されるのはサブクラス書き換え後のバージョンである.では、親バージョンはどのように使うのでしょうか.サブクラスの書き換え方法では、superキーを使用して親クラスのバージョンを呼び出すことができます.次の項を参照してください.
class Foo {
public void f() {
System.out.println("Foo.f()");
}
}
class Goo extends Foo {
public void f() {
super.f();
System.out.println("Goo.f()");
}
}
class Test{
public static void main(String[] args){
Foo obj2 = new Goo();
obj2.f();
}
}
出力結果:Foo.f() Goo.f(). super.f()は親Fooのf()メソッドを呼び出すことができ,このような構文は通常,子クラスの書き換えメソッドが親メソッドに基づいて行う機能拡張に用いられる.
継承された親子関係: