日期:2014-05-20  浏览次数:20818 次

关于多态,后期绑定的疑问
Thinking   in   Java里面有这样一句话
“除了static和final方法外,其他方法都是后期绑定”
也就是说static和final方法都是前期绑定的咯?

看下面的这段src
import   java.util.Random;

class   A   {
public   void   test()   {
System.out.println(   "   A   "   );
}
}

class   B   extends   A   {
public   void   test()   {
System.out.println(   "   B   "   );
}
}

class   C   extends   A   {
public   void   test()   {
System.out.println(   "   C   "   );
}
}

public   class   Test   {
private   static   final   void   test(   A   a   )   {
a.test();
}
public   static   void   main(String[]   args)   {
Random   rand   =   new   Random();
int   i   =   rand.nextInt(   2   );
B   b   =   new   B();
C   c   =   new   C();
Test   t   =   new   Test();
if   (   i   ==   0   )   {
Test.test(   b   );
}   else   {
Test.test(   c   );
}
}
}

Test.test()是static   final的,前期绑定?
但执行结果不是“A”,而是“B”或“C”

是不是我理解错了...


------解决方案--------------------
Test.test()是静态绑定的,但A,B,C中的test()方法都是动态绑定的。你现在是在用一个静态绑定的方法去调用一个动态绑定的方法,动态绑定是发生在A,B,C中的test(),而不是发生在Test中的test()。
------解决方案--------------------
请注意,Test.test中的A a是后运行期间传入的,所以这个例子是说明后期绑定的。
静态绑定是不能继承和修改的。