1. 動的バインディングのプロセス:
例:
public class Son extends Father Son son = new Son();3 son.method();
1. まず、コンパイラは、宣言された型とメソッドに基づいて、対応するクラスを検索します。オブジェクト (Son) の名前とその親クラス (Father) の「メソッド テーブル」から、アクセス属性が public であるすべてのメソッド メソッドを検索します。
method という名前のメソッドが複数存在する場合がありますが、パラメータの型や数が異なります。
2. 次に、メソッドの「シグネチャ」に基づいて完全に一致するメソッドを見つけます。
メソッドの名前とパラメーターのリストは、メソッドのシグネチャと呼ばれます。
Java SE 5.0 より前のバージョンでは、親クラスのメソッドをオーバーライドする場合、戻り値の型は同じである必要があります。サブクラスがスーパークラス メソッドをオーバーライドする場合、その戻り値の型を元の型のサブタイプとして定義できるようになりました。
public Father getFather(){...} //父类中的方法 public Son getFather(){...} //子类覆盖父类中的getFather()方法
3.プライベート、静的、最終メソッドまたはコンストラクターの場合、コンパイラはどのメソッドを呼び出すべきかを明確に認識しており、この呼び出しメソッドは「静的呼び出し」と呼ばれます。
4. メソッドを呼び出します。
method() メソッドがサブクラス Son で定義されている場合、サブクラス内の対応するメソッドが直接呼び出されます。対応するメソッドがサブクラス Son に定義されていない場合、method() はそのサブクラス内で見つかります。親クラスのメソッド。
2. デモ
1. サブクラスは親クラスのメソッドをオーバーライドし、サブクラスのメソッドを呼び出します
public class Father{ public void method(){ System.out.println("父类方法:"+this.getClass()); } } public class Son extends Father{ public void method(){ System.out.println("子类方法"+this.getClass()); } public static void main(String[] args){ Father instance = new Son(); instance.method(); } } //结果:子类方法:class Son
2. サブクラスは次のとおりです。親クラスのメソッドをオーバーライドすることはできないため、親クラスに移動して対応するメソッドを見つけます
public class Father{ public void method(){ System.out.println("父类方法:"+this.getClass()); } } public class Son extends Father{ public static void main(String[] args){ Father instance = new Son(); instance.method(); } } //结果:父类方法:class Son
3. 動的バインディングはオブジェクトのみのメソッドであり、属性には無効です。プロパティをオーバーライドできないためです。
うわー以上がJava 動的バインディング メカニズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。