5

だから私はプログラムがなぜそれがそうであるようにコンパイルされているのかを理解しようとしています、うまくいけばあなたたちは私のためにそれを説明することができます。

class Vehicle{
   public void drive() throws Exception{
     System.out.println("Vehicle running");
   }
}

class Car extends Vehicle{
   public void drive(){
      System.out.println("Car Running");
   }

   public static void main(String[] args){
      Vehicle v = new Car();
      Car c = new Car();
      Vehicle c2 = (Vehicle) v;

      c.drive();
      try {
          v.drive();
      } catch (Exception e) {
          e.printStackTrace();
      } //try v.drive()

      try {
          c2.drive();
      } catch (Exception e) {
          e.printStackTrace();
      } //try c2.drive()
   }
}

したがって、上記のプログラムの出力は次のようになります。

カーランニング
カーランニング
カーランニング

私の質問は、vおよびc2オブジェクトに対してdrive()メソッドを呼び出すためにtry / catchブロックを実行する必要があるのに、cではないのはなぜですか?それらはすべてCarのインスタンスなので、ここで何が起こっているのでしょうか。

4

4 に答える 4

10

Vehicledrive()例外をスローするメソッドがあります。

Carのメソッドを、例外をスローしない独自Vehicleのメソッドでオーバーライドします。Drive()Drive()

実行する出力を取得する理由はVehicle v、car型であっても、コンパイラーはコンパイル時にその事実を認識しないためv.drive()、コンパイラーを呼び出すときに、Carのdriveメソッドを呼び出していることを認識しないためです。

v次の方法でインスタンス化したとしましょう。

Vehicle v;
if(rand(0,1) == 1)
    v = new Car();
else
    v = new Vehicle();

コンパイルすると、vが車かどうかわかりません。プログラムを実行するまでわかりません。

于 2012-07-12T19:50:18.770 に答える
1

オーバーライドされたメソッドは、それらが返すものとスローするものについてより具体的にすることができます。返されるオブジェクトと例外のサブクラスを使用したり、親のメソッドシグネチャで宣言された例外を省略したりできます。((Vehicle)new Car())。drive()を呼び出すと、子の実装が実行されますが、コンパイル時に親のメソッドシグネチャが使用されるため、Vehicleで定義された例外をキャッチする必要があります。

于 2012-07-12T20:22:27.270 に答える
0

我々は持っています:

  Vehicle v = new Car();
  Car c = new Car();
  Vehicle c2 = (Vehicle) v;

この時点で、vおよびc2ですVehicle。これは、を呼び出していることを意味しpublic void drive() throws ExceptionますVehicle。そのため、これらのメソッドにはtry / catchが必要ですが、でc.drive()はありません(そのメソッドは例外をスローしないため)。

于 2012-07-12T19:51:15.853 に答える
0

他の回答は、オーバーライドされた方法を説明しています。ただし、別の問題があります。あなたが言った:

それらはすべてCarのインスタンスなので、ここで何が起こっているのでしょうか。

しかし、コンパイラーにとって、それらはすべてCarのインスタンスではありません-コンパイラーは変数のタイプを調べます:

  Vehicle v = new Car();
  Car c = new Car();
  Vehicle c2 = (Vehicle) v;

コンパイル時に、は、としてv扱われ、例外はそれに応じて処理されます。実行時に、JVMは実際にが含まれていることを認識しますが、それは異なります。VehiclecCarvCar

于 2012-07-12T19:54:19.977 に答える