第一个源代码 public class Parent 

public void test() 

System.out.println ( "父类中的test方法" ) ; 


class Son extends Parent 

public void test() 

System.out.println ( "子类中的test方法" ) ; 
} public static void main ( String[] args ) 

Parent p=new Son(); 
p.test(); 

} 输出:子类中的test方法 
第二种源代码 public class ParentTest 
{ static void youzi () 

System.out.println ( "父类中的方法youzi" ) ; 


class SonTest 
extends ParentTest 

static void youzi () 
{ System.out.println ( "子类中的方法youzi" ) ; 
} public static void main ( String[] args ) 

ParentTest pt = new SonTest () ; 
pt.youzi () ; 

} 输出:父类中的方法youzi 
为什么两次会出现不同的结果呢。不解中

解决方案 »

  1.   

    因为static方法不能被重写,代码2中pt.youzi () ;相当于ParentTest.youzi () ; 
      

  2.   

    多态中:
       1.子类对象方法重写了.实际调用子类重写后的方法;(非static);
       2.static方法因为创建了.static池所以调的还是原来的.
    你可以看一下"单例模式",就是很好的应用.
      

  3.   

    可是为什么pt.youxi() 输出的是调用类中的"父类中的方法youzi"啊,我明明重写了在子类中重写了youxi()方法,并且构造时用的ParentTest pt = new SonTest () ; 应该调用的是子类重写过的youxi()方法吧?
      

  4.   


    private static 类型的变量和方法不能被重写!
      

  5.   

    在java 运行环境中,通过引用类型变量来访问所引用对象的方法和属性的时候,java 虚拟机采用如下的
    绑定规则 :
         1)实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,在运行时,由java虚拟机动态决定的。
         2)静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,在代码编译阶段就绑定了。
         3)成员变量(包括类变量和实例变量)与引用变量所声明的成员变量绑定,这种绑定也属于静态绑定。这个java 虚拟机 动态绑定的规则清楚了,问题就解决拉。。