这段话前后矛盾啊,前面说不能覆写,后面又说通过声明一个同样签名的方法,可以将父类的静态方法隐藏掉,这跟覆写并没有表现上的区别啊,不过我想这在JVM本质上是有区别的。
JVM在处理子类对父类静态方法的覆写时,实际上不是替换掉原有的父类静态方法,而是将父类的静态方法隐藏掉而不能访问,另外创建一个内存区域保存新的子类静态方法。

解决方案 »

  1.   

    Tutorial里面的Override和Hide应该不是一个概念, 被Override后我还是可以使用Supper Class的Static方法, 但Hide以后我将只能使用Sub class的Static方法了, 就算是Supper class的对象调用这个方法, 也是调用Sub class中的...供讨论...
      

  2.   

    我刚刚把楼主的程序运行了一下,确实结果是
    parent child
    不过我加了一句
    parentClass cld = new childClass();
    cld.display();
    结果是parent
    如果是普通的方法的话,从多态的观点来说,结果应该是child.我想这就是静态方法的不同之处了.
    那么Tutorial中的意思应该是仅在子类中"Hide"静态方法....
      

  3.   

    Override和Hide不是一个概念,如下写程序,你就会发现你的问题:class parentClass
    {
    public static void display()
    {
    System.out.print( "parent\t" );
    }
    }class childClass extends parentClass
    {
    public static void display()
    {
    System.out.print( "child\t" );
    }
    }class appClass
    {
    public static void main( String[] args )
    {
    parentClass parentObject = new childClass();
    parentObject.display(); parentClass childObject = new childClass();  //upcast
    childObject.display();
    }
    }
      

  4.   

    两次打印的结果都是:parent,也就是说static方法不是多态方法.
      

  5.   

    A subclass can hide a static method in the superclass by declaring a static method in the subclass with the same signature as the static method in the superclass.
    是说如果子类定义了同父类相同的静态的方法,则通过子类或孙子类来调用此方法时因子类的定义隐藏了父类中的方法所以只能调用到子类中定义的该方法。
    另外我认为静态方法应该由类直接调用,不应使用实例来调用。
    以下为Eclipse发出的警告:
    The static method display() from the type parentClass should be accessed in a static way
      

  6.   

    感谢上面几位的回答和建议,中午过后就结贴。另外我想问treeroot(天才--天天被人踩,人才--人人都想踩)的是:parentClass parentObject = new childClass();
    parentObject.display();
    childClass childObject = new childClass();
    childObject.display();分别输出parent、child,那是根据引用变量的类型动态的调用相应的display(),那从外观上来看不是多态吗(不是真正的)?
      

  7.   

    引用:Jiazi840207(Jiazi)
    不过我加了一句
    parentClass cld = new childClass();
    cld.display();
    结果是parent
    如果是普通的方法的话,从多态的观点来说,结果应该是child.我想这就是静态方法的不同之处了.
    另外类名应该为大写字母打头,程序应修改为:
    class ParentClass {
    public static void display() {
    System.out.print("parent\t");
    }
    }class ChildClass extends ParentClass {
    public static void display() {
    System.out.print("child\t");
    }
    }class GrandChildClass extends ChildClass {}class AppClass {
    public static void main(String[] args) {
    ParentClass parentObject = new ChildClass();//not need
    ParentClass.display(); ChildClass childObject = new ChildClass();//not need
    ChildClass.display(); ParentClass cld = new ChildClass();//not need
    ParentClass.display(); GrandChildClass.display();//ParentClass.display() hided by ChildClass
    }
    }parent child parent    child实际上你明确指定了调用那各类的静态方法,这里不存在多态
      

  8.   

    kerosun(),至于类名,我是直接复制的楼主的程序,没有改过来而已,首字母小写编译也不会出错.另外,我说的多态,是我说把楼主的程序中的静态方法改为普通方法(我说的是"...如果是普通的方法的话,从多态的观点来说..."),可能是你没有看得太清楚.
      

  9.   

    另外,楼主说的
    parentClass parentObject = new childClass();
    parentObject.display();
    childClass childObject = new childClass();
    childObject.display();如果输出是parent,child的话,就说明不是多态.如果是普通方法,根据多态,输出应该是child,child
      

  10.   

    Jiazi840207(Jiazi),
    我引用你的回贴只是告诉楼主,多态性不是从外观上看的。
    类首字母大写不仅是一种大家都接受的编程风格,也有助于解决楼主的问题。
    ParentClass.display();//说明display是静态方法并由类直接调用。
    GrandChildClass.display();//ParentClass.display() hided by ChildClass
    说明子类隐藏了父类的静态方法,即我对楼主引用的java文档的理解。