class Test
{
    static void print()
    {
           System.out.println("Test");
    }
}
class TestDemo extends Test
{
    static void print()
   {
          System.out.println("TestDemo");
   }
    public static void main(String[]args)
    {
          Test  t=new TestDemo()
           t.print();
     }
}得到的结果是"Test",请问为什么??
如果把static 去掉,结果为"TestDemo",既然t指向了TestDemo,应该访问TestDemo的Print();

解决方案 »

  1.   

    static方法的执行不由实例来决定。也就是说:当执行到t.print();的时候,Java会首先找到t的声明,发现它声明为一个Test类,而Test本身有一个静态方法print(),然后Java就不会继续关心t的实际类型,而直接调用Test的print()。
      

  2.   

    主要是因为java中static和final方法都是早绑定的,他在编译时就决定了是父类类型,所以调用父类的print方法了
    而其他方法都是后绑定,要到运行时根据引用所指的具体对象来调用.