我做了一些程序,得到如下四个结论:
1.静态方法可以覆盖静态方法。
2.非静态方法可以覆盖非静态方法。
3.静态方法不可以覆盖非静态方法。
4.非静态方法不可以覆盖静态方法。
1和2我了解一些,但3和4不清楚,高手给我讲一下3、4吧。

解决方案 »

  1.   

    1是错的,子类中的静态方法和父类即使签名相同也是两个不一样的方法,静态方法是类方法,调用哪个方法是在编译期确定的
    例如Animal a=new Dog();
    a.eat();//假设eat是一个static得,且Animal里和Dog里的eat签名是一样的,那么这句话调用Animal的eat方法,因为调用哪个静态方法是在编译期决定的,而且不鼓励这用用实例调用static方法做法
    3的道理同上
    4的道理也是同上
      

  2.   

    对2楼的一点补充:
    在Java语言规范(Java Language Specification)中,重写是针对实例(非静态)方法的,对于类(静态)方法,如果子类中有一个静态方法的签名与父类的一样,则叫做隐藏(hiding)总结:
    静态/实例方法(static method/instance method):重写(overriding)
    非静态/类方法(non-static method/class method):隐藏(hiding)
      

  3.   

    其实对静态来说根本就没有重写这么一说。只是叫冲突。重写是对动态来说的,也就是对面向对象来说的。
    3.静态方法不可以覆盖非静态方法。
    4.非静态方法不可以覆盖静态方法。  
    这个冲突 viszl也举了例子了。
    记住重写只会是父子类之间的动态方法上,如果重写都不成功,那不叫重写!
      

  4.   

    2楼的总结正好写反了静态方法没有override这个说法,
      

  5.   

    我也没有说static method有重写的说法啊...