java 动态绑定 dynamic binding

来源:互联网 发布:皖西学院网络课程 编辑:程序博客网 时间:2024/06/08 18:52

Thinkng in java中描述:Java中除了static和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定(动态绑定,运行时绑定).

但是对于“覆盖”私有方法却会是这样的:

public class PrivateOverride {  private void f() { System.out.println("private f()"); }  public static void main(String[] args) {    PrivateOverride po = new Derived();    po.f();  }}class Derived extends PrivateOverride {  public void f() { System.out.println("public f()"); }} 

输出:

private f()

上述子类中的f()方法实际上是新的方法,因为基类的f()方法是private的,而private方法默认是final的,动态绑定在此无法实现.

然而对于基类域的访问,则在编译期间进行解析:

class Super {  public int field = 0;  public int getField() { return field; }}class Sub extends Super {  public int field = 1;  public int getField() { return field; }  public int getSuperField() { return super.field; }}public class FieldAccess {  public static void main(String[] args) {    Super sup = new Sub(); // Upcast    System.out.println("sup.field = " + sup.field +      ", sup.getField() = " + sup.getField());    Sub sub = new Sub();    System.out.println("sub.field = " +      sub.field + ", sub.getField() = " +      sub.getField() +      ", sub.getSuperField() = " +      sub.getSuperField());  }}

输出为:

sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

很明确,域不参与动态绑定.

0 0