gpt4 book ai didi

java - 为什么这是静态绑定(bind)而不是动态绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:10 25 4
gpt4 key购买 nike

对于静态和动态之间的区别,我仍然有些困惑。据我所知,动态使用对象而静态使用类型,动态在运行时解析,而静态在编译时解析。那么 this.lastName.compareTo(s1.lastName) 不应该改用动态绑定(bind)吗?

key.compareTo(list[position-1]) 使用动态绑定(bind)

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)) 使用静态绑定(bind)?

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??

}
}

最佳答案

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

Java 有静态绑定(bind)和动态绑定(bind)。绑定(bind)是指变量绑定(bind)到特定数据类型。

静态/早期绑定(bind)在编译时完成:私有(private)、最终和静态方法和变量。以及重载方法

动态/延迟绑定(bind)在运行时完成:可以覆盖方法的方法。这就是在运行时启用多态行为的原因。

为了进一步证明这一点,请查看这段代码,看看您是否可以确定何时是早期绑定(bind)和后期绑定(bind):

/* 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。
  • 这是因为 equals 方法被重载了(注意:不同的方法签名与对象类相比等于)
  • 因此 EarlyLateBinding 类型绑定(bind)到变量 t3编译时间。

.

关于java - 为什么这是静态绑定(bind)而不是动态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42710366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com