【问题标题】:Dynamic Binding and Static Binding动态绑定和静态绑定
【发布时间】:2012-10-29 14:20:43
【问题描述】:

这个问题对某些人来说可能听起来很愚蠢,但我需要弄清楚。

 class J_SuperClass { 



void mb_method() { 
     System.out.println("J_SuperClass::mb_method"); 
   } 
   static void mb_methodStatic() { 
      System.out.println("J_SuperClass::mb_methodStatic"); 
   } 
} 
public class J_Test extends J_SuperClass { 
   void mb_method() { 
     System.out.println("J_Test::mb_method"); 
   } 
   static void mb_methodStatic() { 
     System.out.println("J_Test::mb_methodStatic"); 
   } 
   public static void main(String[] args) { 
     J_SuperClass a = new J_Test(); 
     a.mb_method(); 
     a.mb_methodStatic(); 
     J_Test b = new J_Test(); 
     b.mb_method();
     b.mb_methodStatic(); 
   } 
}

输出是:

J_Test::mb_method 
J_SuperClass::mb_methodStatic 
J_Test::mb_method 
J_Test::mb_methodStatic

我知道动态绑定发生在运行时,而静态绑定发生在编译时。此外,对于动态绑定,对象的实际类型决定了调用哪个方法。所以我的问题是,在上面的代码中,“静态”这个词会导致静态绑定,因此对象的 DECLARED 类型决定了调用哪个方法?

【问题讨论】:

  • @user1109363 Re: 你的盐渍问题,看看herehere

标签: java


【解决方案1】:

是的,静态这个词决定了静态绑定,因为在静态方法的情况下没有多态性(因此需要动态绑定)。该方法绑定到名称,而不是类型,因为它是该类中唯一具有该名称的方法;它与任何对象无关,因为它是静态的。

【讨论】:

    【解决方案2】:

    您可以尝试反编译 J_Test 类。在那里你会看到:

    public static void main(String args[])
        {
            J_SuperClass a = new J_Test();
            a.mb_method();
            J_SuperClass.mb_methodStatic();
            J_Test b = new J_Test();
            b.mb_method();
            mb_methodStatic();
        }
    

    这样,超类的静态方法就绑定了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多