静态方法隐藏

时间:2018-04-08 17:44:24

标签: java

请看下面的代码:

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

1 个答案:

答案 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()。

What is static and dynamic binding ?

Source of above answer