Почему это статическая привязка, а не динамическая привязка?

Я все еще немного запутался в отношении разницы между статическим и динамическим. Из того, что я знаю, динамический использует объект, в то время как статический тип использования и этот динамический разрешается во время выполнения, а статический - во время компиляции. поэтому не следует ли this.lastName.compareTo(s1.lastName) использовать вместо этого динамическую привязку?

key.compareTo(list[position-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??

    }
}

person Challenger    schedule 10.03.2017    source источник
comment
Я предполагаю, что lastName это String? Если это так, поскольку String является окончательным, его нельзя расширить, поэтому ни один из его методов не может быть переопределен. Следовательно, реализация известна во время компиляции.   -  person azurefrog    schedule 10.03.2017
comment
да, фамилия - это строка! Хороший улов, я даже не заметил!   -  person Challenger    schedule 10.03.2017
comment
но почему key.compareTo(list[position-1]) использует динамическую привязку?   -  person Challenger    schedule 10.03.2017
comment
Методы compareTo интерфейсов Comparable переопределяются и, следовательно, проверяются во время выполнения. посмотрите на мой ответ ниже.   -  person Shivam Sinha    schedule 10.03.2017


Ответы (2)


Ваш вопрос не является полным и не включает весь соответствующий код. Однако это основное различие между различными привязками.

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 и продолжается, как вы ожидаете.
  • Единственный сценарий, в котором фактически вызывается метод equals объекта EarlyLateBinding, — это оператор 3.
  • Это связано с тем, что метод equals перегружен (Примечание: другая сигнатура метода по сравнению с классом объекта equals)
  • Следовательно, тип EarlyLateBinding привязывается к переменной t3 во время компиляции.

.

person Shivam Sinha    schedule 10.03.2017

в этом коде

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;
    }
}

ключ может быть чем угодно, что реализует интерфейс Comparable, поэтому во время компиляции компилятор не знает точный тип, поэтому тип разрешается во время выполнения с использованием объекта, который >ключ ссылается на.

Но в этом коде

@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));

    }
}

компилятор знает тип s1, поэтому он использует статическую привязку

person Keaz    schedule 10.03.2017