14

このコードについて質問があります

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メソッドを呼び出しますが、静的であるため、オーバーライドできず、CarではなくクラスMiniのメソッドを呼び出します。

これは正しいです?

しかし、私の教科書には、答えは次のようになっているはずだと書かれています:a、d

タイプミスですか?私は今少し混乱しているので。

これを片付けてください、ありがとう。

4

2 に答える 2

36

cはm1メソッドを呼び出しますが、静的であるため、オーバーライドできず、CarではなくクラスMiniのメソッドを呼び出します。

それはまったく逆です。

cはとして宣言されてCarいるため、を介して行われる静的メソッド呼び出しは、でc定義されたメソッドを呼び出しますCar。コンパイラは、実際にを保持していることを認識せずに、に直接
コンパイルします。c.m1()Car.m1()cMini

そのため、そのようなインスタンスを介して静的メソッドを呼び出さないでください。

于 2012-12-04T04:19:15.647 に答える
3

Inheritanceで作業しているときに、同じ問題に直面しました。私が学んだことは、呼び出されるメソッドが静的である場合、インスタンス化されるクラスからではなく、参照変数が属するクラスから呼び出されるということです。

 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");
        }   
    }

ここに画像の説明を入力してください

于 2020-05-16T18:41:30.747 に答える