Java(マルチステート)(書き換え)
2394 ワード
!!!簡単に言えば、多態性とは、1つの名前が複数の異なる実装形態に対応できることを意味する.Javaのマルチステート性は、マルチステートのコンパイルとマルチステートの実行の2つの側面に現れます.コンパイルマルチステートとは、メソッドのリロードなど、プログラムのコンパイル中に現れるマルチステート性を指す.メソッド名は同じであるが、パラメータが異なるため、呼び出し時にシステムが伝達パラメータの違いに基づいて呼び出されるメソッドを決定する.このプロセスは、コンパイル時に完了し、例えば、図面を描くクラスを定義し、draw()メソッドが図面を描くために使用され、異なる使用状況に応じて、文字列、行列、円形などのパラメータを受け入れることができます.各インプリメンテーションについて、メソッド名はdraw()であるが、具体的なインプリメンテーション方式が異なり、別途名前を付ける必要がなく、メソッドのインプリメンテーションと呼び出しを大幅に簡略化し、プログラマは多くのメソッド名を覚える必要がなく、対応するパラメータを渡すだけでよい.マルチステートを実行すると、クラスの継承とメソッドの書き換えが発生します.サブクラスは親の属性とメソッドを継承するため、親オブジェクトが使用できる場所であれば、子オブジェクトも使用できます.例えば、クラスAおよびクラスBは、サブクラスBのオブジェクトを直接生成し、その参照を親クラスAのオブジェクトに付与することができる.A a=new B(); B b=new B()に等しい.A a=b;//暗黙的なタイプ変換には、サブクラスが親のメンバーメソッドを書き換えた場合、メソッドを呼び出すときに、親のメソッドと子のメソッドのどちらを呼び出すべきかという問題があります.これはコンパイルで決定することはできません.システムが実行時に実際に決定する必要があるので、この方法の書き換えによるマルチステートを実行マルチステートと呼びます.Javaは、書き換えの方法について、Javaがそのメソッドインスタンスを呼び出すタイプに応じてどのメソッドを選択するかを決定し、子クラスのインスタンスについて、子クラスが親クラスのメソッドを書き換えた場合、子クラスのメソッドを呼び出し、子クラスが親クラスを書き換えない場合、親クラスのメソッドを呼び出すことを規定している.
実行結果inside A inside B inside B解析:インスタンスaおよびbのタイプはクラスAおよびクラスBであるため、親クラスおよび子クラスのメソッドcallme()をそれぞれ呼び出せばよい.インスタンスcの場合、彼は子クラスBのオブジェクトとしてインスタンス化され、子クラスはメソッドcallme()を書き換えたということになるので、この場合はサブクラスBのメソッドを呼び出すべきなのでinside Bを出力する.
class A{
void callme()
{
System.out.println("inside A");
}
}
class B extends A{
void callme()
{
System.out.println("inside B");
}
}
public class TV {
public static void main(String args[])
{
A a=new A();
B b=new B();
A c=new B();
a.callme();
b.callme();
c.callme();
}
}
実行結果inside A inside B inside B解析:インスタンスaおよびbのタイプはクラスAおよびクラスBであるため、親クラスおよび子クラスのメソッドcallme()をそれぞれ呼び出せばよい.インスタンスcの場合、彼は子クラスBのオブジェクトとしてインスタンス化され、子クラスはメソッドcallme()を書き換えたということになるので、この場合はサブクラスBのメソッドを呼び出すべきなのでinside Bを出力する.