请看下面的代码:
class Marsupial {
public static boolean isBiped() {
return false;
}
public void getMarsupialDescription() {
System.out.println("Value of this : " + this.getClass().getName() + " , Marsupial walks on two legs: " + isBiped());
}
}
public class Kangaroo extends Marsupial {
public static boolean isBiped() {
return true;
}
public void getKangarooDescription() {
System.out.println("Value of this : " + this.getClass().getName() + ", Kangaroo hops on two legs: " + isBiped());
}
public static void main(String[] args) {
Kangaroo joey = new Kangaroo();
joey.getMarsupialDescription(); // Question here
joey.getKangarooDescription();
}
}
输出结果为:
Value of this : Kangaroo , Marsupial walks on two legs: false
Value of this : Kangaroo, Kangaroo hops on two legs: true
现在为什么在getMarsupialDescription()的调用中,它会选择Marsupial的静态方法而不是袋鼠,特别是当this
指向Kangaroo
时?
答案 0 :(得分:1)
简单地将方法调用关联到方法体是绑定的类型。 [What is binding ?]有两种类型的绑定:静态绑定在编译时发生,动态绑定在运行时发生。
静态绑定或早期绑定
编译器在编译时可以解析的绑定称为静态或早期绑定。 static,private和final方法的绑定是编译时的。为什么?原因是无法覆盖这些方法,并且在编译时确定类的类型。让我们看一个例子来理解这个:
Human walks
Human walks
为什么在编译时?因为它是静态的。 静态绑定由引用类型而不是对象类型完成。
<强>输出:强>
for pkg in $(pip list | cut -d' ' -f1) ; do pip install $pkg -U ; done
同样在上面的代码中 - isBiped()静态方法仅在编译时链接到方法体。因此它调用Marsupial isBiped()。