菜鸟求助:下面这段代码,为什么输出的是 bird fly 而 不是chicken fly呢?
class bird
{
public  static void fly()
{
System.out.println("bird fly");
}
}public class chicken extends bird
{
public static void fly()
{
System.out.println("chicken fly");
}
public static void main(String[] args) 
{
bird b = new chicken();
b.fly();
}
}
java 重写 多态

解决方案 »

  1.   

    bird b = new chicken();
    父类型指向子类型引用,如果调用方法被子类重写,运行时将调用实际指向类型(这里是chicken)重写的方法,如果子类新写了一个父类中没有的方法,比如chicken中有一个walk()方法,b.walk();就是错误的,这是因为编译器在编译期根据声明类型编译
      

  2.   

    因为“静态”方法是“静态”绑定的,没有重写一说。
    编译器不认为chicken.fly()是bird.fly()的重写。
      

  3.   

    仔细看看static的用法。
    加了static关键字的类成员是和该类创建的任何对象都无关的,也就是说实例化对static方法无效
    static通过类名调用,普通方法通过类的对象调用。
    这个程序里面,b.fly()和bird.fly()没有区别如果你要调用chichen下面的fly(),只能用chichen.fly();
      

  4.   


    这貌似解释不通为什么是输出 bird fly 而不是 chicken fly 哦
      

  5.   

    楼主
    静态方法无论是被对象还是被类名称调用,都是本来的静态方法,不存在和子类或者其他的关系。
    但是如果你把你代码的两个fly方法中static去掉,那就不一样,你new一个子类对象并且让父类指向它,其实还是子类中的方法。所以要区分情况!