2017-03-10 8 views
3

私はまだ静的と動的の違いについて少し混乱しています。私が知っていることから、静的使用型の間は動的オブジェクトが使用され、その動的は実行時に解決され、静的はコンパイル時に解決されます。 this.lastName.compareTo(s1.lastName)ではなく動的バインディングを使用する必要がありますか?これはなぜ動的バインディングではなく静的バインディングですか?

key.compareTo(リスト[位置-1])

public static void insertionSort (Comparable[] list) 
{ 
    for (int index = 1; index < list.length; index++) 
    { 
     Comparable key = list[index]; 
     int position = index; 
     while (position > 0 && key.compareTo(list[position-1]) < 0) // using dynamic binding 
     { 
      list[position] = list[position-1]; 
      position--; 
     } 
      list[position] = key; 
    } 
} 

なぜ(this.lastName.compareTo(s1.lastName))スタティックバインディングを動的使用しないバインディングを使用しますか?

private String firstName; 
private String lastName; 
private int totalSales; 

@Override 
public int compareTo(Object o) { 
    SalePerson s1 = (SalePerson)o; 

    if (this.totalSales > s1.getTotalSales()) 
    { 
     return 1; 
    } 

    else if (this.totalSales < s1.getTotalSales()) 
    { 
     return -1; 
    } 

    else //if they are equal 
    { 
     return (this.lastName.compareTo(s1.lastName)); //why is this static binding?? 

    } 
} 
+2

をスタティックバインディングを使用S1の種類を知っていますか?そうであれば、 'String'はfinal型であるため、拡張することはできません。したがって、そのメソッドのどれもオーバーライドできません。したがって、実装はコンパイル時に知られています。 – azurefrog

+0

はいlastNameは文字列です!グッドキャッチ、私はそれを見つけませんでした! – Challenger

+0

しかし、なぜkey.compareTo(list [position-1])がdyamicバインディングを使用していますか? – Challenger

答えて

1

あなたの質問は完全ではなく、すべての関連コードを含んでいません。しかし、これは異なるバインディングの基本的な違いです。

Javaは静的バインディングと動的バインディングの両方を持っています。バインディングとは、変数が特定のデータ型にバインドされている場合を指します。

スタティック/アーリーバインディングは、プライベート、ファイナルおよびスタティックのメソッドと変数のコンパイル時に実行されます。また、オーバーロードされたメソッドの場合

動的/遅延バインディングは、実行時にオーバーライドされたメソッドを実行できます。これは、実行時に多態的な動作を可能にするものです。この点をさらに実証するために

このコードを見て、それが早くなると遅延バインディングだろうというとき、あなたが決めることができるかどうかを確認:

/* What is the output of the following program? */ 

public class EarlyLateBinding { 

public boolean equals(EarlyLateBinding other) { 
    System.out.println("Inside of overloaded Test.equals"); 
    return false; 
} 

public static void main(String[] args) { 

    Object t1 = new EarlyLateBinding(); //1 
    Object t2 = new EarlyLateBinding(); //2 
    EarlyLateBinding t3 = new EarlyLateBinding(); //3 
    Object o1 = new Object(); 


    Thread.currentThread().getStackTrace(); 

    int count = 0; 
    System.out.println(count++); 
    t1.equals(t2);//n 
    System.out.println(count++); 
    t1.equals(t3);//n 
    System.out.println(count++); 
    t3.equals(o1); 
    System.out.println(count++); 
    t3.equals(t3); 
    System.out.println(count++); 
    t3.equals(t2); 
} 
} 

回答:

  • ++の後にあります結果が返される前に0が返されます。したがって、0で始まり、期待どおりに進みます。
  • EarlyLateBindingオブジェクト の等しい方法が実際に呼び出される唯一のシナリオは、equalsメソッドがオーバーロードされているからであるステートメント3
  • である(注:異なる メソッドシグネチャをクラスに等しいオブジェクトと比較して)
  • したがって、タイプEarlyLateBindingは、 コンパイル時に変数t3にバインドされます。

キーはタイプが使用することにより、実行時に解決されるように、コンパイル時にコンパイラで非常に匹敵インタフェースは正確な型を知らない実装して何もすることができます

1
このコードで

public static void insertionSort (Comparable[] list) 
{ 
    for (int index = 1; index < list.length; index++) 
    { 
     Comparable key = list[index]; 
     int position = index; 
     while (position > 0 && key.compareTo(list[position-1]) < 0) 
     { 
      list[position] = list[position-1]; 
      position--; 
     } 
      list[position] = key; 
    } 
} 

オブジェクトはキーを指します。

しかし、このコードでは、

@Override 
public int compareTo(Object o) { 
    SalePerson s1 = (SalePerson)o; 

    if (this.totalSales > s1.getTotalSales()) 
    { 
     return 1; 
    } 

    else if (this.totalSales < s1.getTotalSales()) 
    { 
     return -1; 
    } 

    else //if they are equal 
    { 
     return (this.lastName.compareTo(s1.lastName)); 

    } 
} 

コンパイラは、そう、それは私がlastName`が `STRING`ある`推測している

関連する問題