当前位置: 首页 > 知识库问答 >
问题:

为什么这是静态绑定而不是动态绑定?

董良策
2023-03-14

关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗?

钥匙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 . last name . compare to(S1 . last name))为什么使用静态绑定?

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个答案

董新觉
2023-03-14

在此代码中

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

key可以是实现Comparable接口的任何东西,因此在编译时编译器不知道确切的类型,因此在运行时通过使用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));

    }
}

编译器知道s1的类型,所以它使用静态绑定

习和通
2023-03-14

您的问题不完整,没有包含所有相关代码。然而,这是不同绑定之间的基本区别

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

答:

    < li >在计数之后,因此返回的结果在递增之前是0。因此,从0开始,并按照您的预期进行。 < li >实际调用EarlyLateBinding对象的equals方法的唯一情况是语句3。 < li >这是因为equals方法被重载(注意:与对象类equals相比,方法签名不同) < li >因此,类型EarlyLateBinding在编译时被绑定到变量t3。

.

 类似资料:
  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 本文向大家介绍什么是iOS的动态绑定 ?相关面试题,主要包含被问及什么是iOS的动态绑定 ?时的应答技巧和注意事项,需要的朋友参考一下 —在运行时确定要调用的方法 动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。

  • 起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。

  • 本文向大家介绍静态绑定和动态绑定之间的区别,包括了静态绑定和动态绑定之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解静态绑定和动态绑定之间的区别。 静态绑定 它在编译时解决。 它使用类和字段的类型。 它使用私有,最终和静态方法和变量。 示例:重载 动态绑定 在运行时解决。 虚方法使用此技术。 它使用对象来解决绑定。 示例:方法覆盖。