这段话前后矛盾啊,前面说不能覆写,后面又说通过声明一个同样签名的方法,可以将父类的静态方法隐藏掉,这跟覆写并没有表现上的区别啊,不过我想这在JVM本质上是有区别的。
JVM在处理子类对父类静态方法的覆写时,实际上不是替换掉原有的父类静态方法,而是将父类的静态方法隐藏掉而不能访问,另外创建一个内存区域保存新的子类静态方法。
JVM在处理子类对父类静态方法的覆写时,实际上不是替换掉原有的父类静态方法,而是将父类的静态方法隐藏掉而不能访问,另外创建一个内存区域保存新的子类静态方法。
调试欢乐多
parent child
不过我加了一句
parentClass cld = new childClass();
cld.display();
结果是parent
如果是普通的方法的话,从多态的观点来说,结果应该是child.我想这就是静态方法的不同之处了.
那么Tutorial中的意思应该是仅在子类中"Hide"静态方法....
{
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();
}
}
是说如果子类定义了同父类相同的静态的方法,则通过子类或孙子类来调用此方法时因子类的定义隐藏了父类中的方法所以只能调用到子类中定义的该方法。
另外我认为静态方法应该由类直接调用,不应使用实例来调用。
以下为Eclipse发出的警告:
The static method display() from the type parentClass should be accessed in a static way
parentObject.display();
childClass childObject = new childClass();
childObject.display();分别输出parent、child,那是根据引用变量的类型动态的调用相应的display(),那从外观上来看不是多态吗(不是真正的)?
不过我加了一句
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实际上你明确指定了调用那各类的静态方法,这里不存在多态
parentClass parentObject = new childClass();
parentObject.display();
childClass childObject = new childClass();
childObject.display();如果输出是parent,child的话,就说明不是多态.如果是普通方法,根据多态,输出应该是child,child
我引用你的回贴只是告诉楼主,多态性不是从外观上看的。
类首字母大写不仅是一种大家都接受的编程风格,也有助于解决楼主的问题。
ParentClass.display();//说明display是静态方法并由类直接调用。
GrandChildClass.display();//ParentClass.display() hided by ChildClass
说明子类隐藏了父类的静态方法,即我对楼主引用的java文档的理解。