32

動的バインディングと静的バインディングについて本当に混乱しています。コンパイル時にオブジェクトの型を決定することは静的バインディングと呼ばれ、実行時に決定することは動的バインディングと呼ばれることを読みました。

以下のコードで何が起こるか:

静的バインディングまたは動的バインディング?
これはどのようなポリモーフィズムを示していますか?

class Animal
{
    void eat()
    {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal
{
    void eat()
    {
        System.out.println("Dog is eating");
    }
}

public static void main(String args[])
{
    Animal a=new Animal();
    a.eat();
}
4

6 に答える 6

69

あなたの例はdynamic bindingです。実行時にタイプが決定されa、適切なメソッドが呼び出されるためです。

ここで、次の 2 つの方法もあるとします。

public static void callEat(Animal animal) {
    System.out.println("Animal is eating");
}
public static void callEat(Dog dog) {
    System.out.println("Dog is eating");
}

に変えてmain

public static void main(String args[])
{
    Animal a = new Dog();
    callEat(a);
}

Animal is eatingへの呼び出しcallEatstatic bindingを使用し、コンパイラはそれaが type であることしか認識していないため、これは出力されますAnimal

于 2013-05-20T10:57:51.313 に答える
23

次のようなことをした場合、これは実際にはオーバーロードオーバーライドに依存します。

public class Animal{}


public class Dog extends Animal{}

public class AnimalActivity{

    public void eat(Animal a){
        System.out.println("Animal is eating");
    }

    public void eat(Dog d){
        System.out.println("Dog is eating");
    }
}

次にメインクラスで:

public static void main(String args[])
{
    Animal a=new Animal();
    Animal d=new Dog();
    AnimalActivity aa=new AnimalActivity();
    aa.eat(a);
    aa.eat(d);
}

2 つの場合の結果は次のようになります。Animal is eating

しかし、少しひねってみましょう。これを持ってみましょう:

public class Animal{
    public void eat(){
        System.out.println("Animal is eating");
    }
}

それから:

public class Dog extends Animal{
    public void eat(){
        System.out.println("Dog is eating");
    }
}

次にメインクラスで:

public static void main(String args[]){
    Animal d=new Dog();
    Animal a=new Animal();
    a.eat();
    d.eat();
}

結果は次のようになります。

Animal is eating
Dog is eating

これは、コンパイル時にバインドをオーバーロードする「静的バインディング」が、実行時にバインドをオーバーライドする「動的バインディング」であるためです。

于 2013-05-20T11:46:52.553 に答える
1

非静的関数の場合、関数が非仮想である場合、つまりfinalキーワードが適用されている場合や関数がprivate. finalは関数が変更できないことをprivate意味し、キーワードはクラス スコープしかないことを意味します。それ以外の場合は、動的バインディングが使用されます。

静的関数の場合、静的バインディングが常に使用されます。型Aが渡されるとA、参照先に関係なく、 のメソッドが実行されAます。

于 2015-03-24T01:33:27.367 に答える
1

現在のコードが出力されます Animal is eating

ただし、メイン クラスでタイプ のオブジェクトを作成し、Dogそれを に割り当てた場合Animal、出力はDog is eating動的バインディングによるものになります。

public static void main(String args[])
{
    Animal a = new Dog(); // An object of Dog is assigned to Animal
    a.eat(); // Dynamically determines which eat() method to call
}

type のオブジェクトを指しているとa宣言されていますが。そのため、実行時にオブジェクト タイプが決定され、適切なメソッドが呼び出されます。AnimalDogeat()

それを考える 1 つの方法は、method overloading静的にバインドされ、method overriding動的にバインドされます。

于 2013-05-20T10:42:36.483 に答える
0

ケース 1:

Animal a =new Animal();
a.eat();

ケース 2:

Animal a=new Dog(); 
a.eat();

ここでは両方とも動的バインドです。コンパイル時にオブジェクトの型が決定されますが、実行時にインスタンスに基づいて、対応する eat メソッドが割り当てられたオブジェクトが JVM によって動的にバインドされるためです。

最初のケースでは、animal クラスの eat メソッドが呼び出されますが、2 番目のケースでは、Animal オブジェクトに Dog インスタンスが割り当てられているため、dog クラスの eat メソッドが呼び出されます。Dog のインスタンスは、animal のインスタンスでもあります。つまり、 "" 犬は動物であるという関係であると見なすことができます。したがって、ここではオブジェクトのタイプが実行時に犬として決定され、JVM が動的に犬クラスの eat メソッドをバインドします。

こちらのリンクもチェック

http://www.javatpoint.com/static-binding-and-dynamic-binding

http://www.coderanch.com/t/386124/java/java/Static-Binding-Dynamic-Binding

于 2013-05-20T10:46:16.957 に答える
0

この従業員クラスには抽象earning()関数があり、各クラスには異なるtoString()実装があることを確認してください

Employee[] employees = new Employee[4];

// initialize array with Employees
employees[0] = new SalariedEmployee();
employees[1] = new HourlyEmployee();
employees[2] = new CommissionEmployee();
employees[3] = new BasePlusCommissionEmployee();
for (Employee currentEmployee : employees){
    System.out.println(currentEmployee); // invokes toString
    System.out.printf("earned $%,.2f%n", currentEmployee.earnings());
}

メソッドtoStringおよびへのすべての呼び出しは、 currentEmployee が参照する に基づいて でearnings解決されます。execution timetype of the object

このプロセスは、dynamic bindingまたはとして知られています。late binding

参照: Java™ How To Program (Early Objects)、第 10 版

于 2017-07-31T07:16:58.677 に答える