JAvaにおける多態の個人的理解
2237 ワード
1.何ですか
マルチステートは文字通り「マルチステート」であり、javaでは同じ関数が異なるオブジェクトに応答することを許可することを指す.
2.なぜ
多態は方法とクラス間の結合を解消することができ、具体的には異なるサブクラスオブジェクトを親とすることができ、異なるサブクラスオブジェクト間の違いを遮断し、共通のコードを書き、需要の絶えず変化に適応するために共通のプログラミングを行うことができる.
3.どうする
マルチステートの実装には、継承、関数の書き換え、および親参照が子オブジェクトを指す3つの条件があります.
マルチステートを実現する技術を動的バインドと呼び、方法が実行時に特定のオブジェクトタイプに基づいてバインドされ、動的バインドまたは実行時バインドとも呼ばれることを意味する.JAvaではstaticメソッドとfinalメソッド(privateを含む)を除いた残りのメソッドは動的バインドである.
staticは、メソッドがクラス自体にバインドされているため、オブジェクトに関係なく、参照が指すオブジェクトがstaticメソッドを呼び出すときに常に親に対応するメソッドを呼び出す.
finalはfinalメソッドが上書きされてはいけない、すなわち書き換えられてはいけないため、動的バインドを実現できない.
マルチステート実装では、親リファレンスが子オブジェクトを指す、いわゆるアップシフトが発生した後に発生する点に注意する必要があります.
まず、サブクラスオブジェクト固有のドメイン(メンバー変数)とメソッド(リロード後のメソッドを含む)は直接アクセスできなくなります(メソッドを借りて間接的にアクセスできます).後述のコードで注釈された2行(コンパイラがエラーを報告し、ドメインまたはメソッドが定義されていません):
添付サンプルコード:
出力結果:
マルチステートは文字通り「マルチステート」であり、javaでは同じ関数が異なるオブジェクトに応答することを許可することを指す.
2.なぜ
多態は方法とクラス間の結合を解消することができ、具体的には異なるサブクラスオブジェクトを親とすることができ、異なるサブクラスオブジェクト間の違いを遮断し、共通のコードを書き、需要の絶えず変化に適応するために共通のプログラミングを行うことができる.
3.どうする
マルチステートの実装には、継承、関数の書き換え、および親参照が子オブジェクトを指す3つの条件があります.
マルチステートを実現する技術を動的バインドと呼び、方法が実行時に特定のオブジェクトタイプに基づいてバインドされ、動的バインドまたは実行時バインドとも呼ばれることを意味する.JAvaではstaticメソッドとfinalメソッド(privateを含む)を除いた残りのメソッドは動的バインドである.
staticは、メソッドがクラス自体にバインドされているため、オブジェクトに関係なく、参照が指すオブジェクトがstaticメソッドを呼び出すときに常に親に対応するメソッドを呼び出す.
finalはfinalメソッドが上書きされてはいけない、すなわち書き換えられてはいけないため、動的バインドを実現できない.
マルチステート実装では、親リファレンスが子オブジェクトを指す、いわゆるアップシフトが発生した後に発生する点に注意する必要があります.
まず、サブクラスオブジェクト固有のドメイン(メンバー変数)とメソッド(リロード後のメソッドを含む)は直接アクセスできなくなります(メソッドを借りて間接的にアクセスできます).後述のコードで注釈された2行(コンパイラがエラーを報告し、ドメインまたはメソッドが定義されていません):
// System.out.println(sup.name);
// sup.sayName();
次に、子オブジェクトで再定義されたドメイン(親と子の同じ名前の変数)について、子オブジェクトがアクセスすると、親オブジェクトのドメイン(後述のコードなど)にアクセスします.sup.field=0
最後に、子オブジェクトで再定義された関数(すなわち、親オブジェクトと子オブジェクトの同名関数)について、ここでは多態の意味に触れ、子オブジェクトが関数にアクセスするときに子オブジェクトに直接アクセスする方法と、子オブジェクトで再定義されたドメイン(すなわち、親オブジェクトと子オブジェクトの同名変数)について、サブオブジェクトのドメインを使用します.sup.getField=1
添付サンプルコード:
class Super{
public int field=0;
public int getField(){
return field;
}
}
class Sub extends Super{
public String name="Sub.name";
public int field=1;
public int getField(){
System.out.println("This is Sub.getField()");
return field;
}
public int getSuperField(){
return super.field;
}
public String sayName(){
return name;
}
}
public class HelloWorld{
public static void main(String[] args){
Super sup=new Sub();
System.out.println("sup.field="+sup.field+" ,sup.getField="+sup.getField());
// System.out.println(sup.name);
// sup.sayName();
Sub sub=new Sub();
System.out.println("sub.field="+sub.field+" ,sub.getField="+sub.getField()+" ,super.field="+sub.getSuperField());
System.out.println(sub.name);
sub.sayName();
}
}
出力結果:
This is Sub.getField()
sup.field=0 ,sup.getField=1
This is Sub.getField()
sub.field=1 ,sub.getField=1 ,super.field=0
Sub.name