多态性和静态方法

2022-09-03 17:08:46

我有一个关于这个代码的问题就在这里

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

是错别字吗?因为我现在有点困惑。

请澄清这一点,谢谢。


答案 1

因为c调用m1方法,但它是静态的,所以它不能重写,它调用Mini类中的方法而不是Car。

这完全是倒退。

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

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


答案 2

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

 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


推荐