第一个源代码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.   

    楼主的第二种代码,应该是输出子类中的方法youzi
      

  3.   

    个人认为:第二组中ParentTest pt = new SonTest () ;
    虽然用父类声明的变量,用子类实例化。但是static方法,不属于对象,属于类。
    所以调用的方法以后打印出父类方法中的内容。          (小弟为新手,若有不对的地方,还请高手指点)
      

  4.   

    但是静态的方法,通过对象名也可以调用啊。
    ParentTest pt = new SonTest () ; 
            pt.youzi () ; 
    还是不懂呢。两者为什么会不同呢。
      

  5.   


    第二段代码我也不太懂。
    static 不会被重写,但为什么调用的是父类的方法new的是SonTest  我认为应该调用SonTest的方法啊
      

  6.   

    1是java的多态的体现
    2是因为,static实际上是通过类访问的,是在编译的时候就决定了的,不过java也允许通过实例去
    访问static方法,我觉得java这个是有点让人误解。
      

  7.   

    首先楼主要了解编译时和运行时的概念,java多态概念第一个源码是多态的范例,因为方法覆盖,属于运行时的概念,也就是当程序编译时被看作是父类对象,运行时看作是子类对象
            变的是引用,实例没变(指向的还是那块内存空间),我认为虚拟机是先去找子类的方法,没有找到就去执行父类的方法第二个源码是打破多态的范列,输出父类的方法是因为static是不支持多态的,只要在类加载时静态成员或方法就会被加载,与对 象无关具体多态是怎么实现的可以看一下虚拟机的原理一书.
    <<The JavaTM Virtual Machine Specification Second Edition>>以上是本人愚见,希望高手指点
      

  8.   

    类实例化一个对象后,在内存中,该类的成员变量和成员方法会产生对于这个对象的一个副本。但是static的方法,所有对象共同享用一个副本。
      

  9.   

    好像static方法不支持继承吧……
      

  10.   

    去看看 什么叫父类引用指向子类对象,
    ParentTest pt = new SonTest () ; 
    pt.youzi () ; 
    看到pt前面的那个ParentTest了吗?他的类型是ParentTest,这个时候在内存中new SonTest ()被看成了ParentTest pt = new ParentTest();也就是说子类的对象的特征都显示不出来了,我表达得不是很清楚,
    你自己去研究研究!
      

  11.   

    "也就是当程序编译时被看作是父类对象,运行时看作是子类对象 
    "这句话不太明白,能详细说一下吗?
    (小弟为新手,若有不对的地方,还请高手指点)
    等待ing!!!
      

  12.   

    static修饰的方法不能被子类重写
      

  13.   

    编译成功了,可是执行时老是失败
    执行JAVA时,显示
    Exception in thread "main" java.lang.NoSuchMethodError: main
    这是怎么回事啊?求助........
      

  14.   

    class ParentTest
    {    static void youzi ()
        {
            System.out.println ( "父类中的方法youzi" ) ;
        }
    }
    public class SonTest
            extends ParentTest
    {
        static void youzi ()
        {        System.out.println ( "子类中的方法youzi" ) ;
        }    public static void main ( String[] args )
        {
            ParentTest pt = new SonTest () ;
            pt.youzi () ;
        }
    }
    改下就好了!
      

  15.   

    第一种不用说了
    说第二种
    父类引用指向子类对象:父类中youzi()方法是静态的,其实就是子类中的youzi()并没有覆盖父类中的youzi(),
    如果是父类引用ParentTest pt=new SonTest() ,当pt.youzi()时会调用父类中的youzi(),因为子类中的youzi()和父类中的youzi()不是具有类继承关系的方法了,pt会找子类中覆盖了父类的youzi()方法(注意是先找子类中的),找不到,就调用父类中的youzi()方法; 
    如果是SonTest pt=new SonTest(),那当然会调用子类的youzi()了;其实《Thinking in Java》第四版中也提到过这个问题,当父类中的被覆盖的方法是private或final,父类引用指向子类对象时候,调用的也是父类的方法。