多态性与静态方法

时间:2012-12-04 04:16:25

标签: java static polymorphism

我对此代码有疑问

public Car {
    public static void m1(){
        System.out.println("a");
    }
    public void m2(){
        System.out.println("b");
    }
}

class Mini extends Car {
    public static void m1() {
        System.out.println("c");
    }
    public void m2(){
        System.out.println("d");
    }
    public static void main(String args[]) {
        Car c = new Mini();
        c.m1();
        c.m2();       
   }
}

我知道多态不能用于静态方法,只能用于实例方法。而且覆盖对静态方法也不起作用。

因此我认为该程序应该打印出来:c,d

因为c调用了m1方法,但是它是静态的,所以它不能覆盖它并且它在类Mini而不是Car中调用方法。

这是对的吗?

然而,我的教科书说答案应该是:a,d

这是一个错字吗?因为我现在有点困惑。

请清除这一点,谢谢。

2 个答案:

答案 0 :(得分:27)

  

因为c调用了m1方法,但是它是静态的,所以它不能覆盖它并且它在类Mini而不是Car中调用方法。

这完全是倒退。

c 声明Car,因此通过c进行的静态方法调用将调用由Car定义的方法。
编译器直接将c.m1()编译为Car.m1(),而不知道c实际上持有Mini

这就是为什么你永远不应该通过这样的实例调用静态方法。

答案 1 :(得分:0)

在处理继承时,我遇到了同样的问题。我了解到,如果被调用的方法是静态的,那么它将从引用变量所属的类而不是实例化该类的类中调用它。

 public class ParentExamp
    {                   
     public static void Displayer()
     {
      System.out.println("This is the display of the PARENT class");
     }
    }

     class ChildExamp extends ParentExamp
    {
        public static void main(String[] args)
        {
          ParentExamp a  = new ParentExamp();
          ParentExamp b  = new ChildExamp();
          ChildExamp  c  = new ChildExamp();

          a.Displayer(); //Works exactly like ParentExamp.Displayer() and Will 
                        call the Displayer method of the ParentExamp Class

          b.Displayer();//Works exactly like ParentExamp.Displayer() and Will 
                        call the Displayer method of the ParentExamp Class

          c.Displayer();//Works exactly like ChildExamp.Displayer() and Will 
                        call the Displayer method of the ChildtExamp Class
        }               
        public static void Displayer()
        {
         System.out.println("This is the display of the CHILD class");
        }   
    }

enter image description here