1

こちらのコードをご覧ください。

class Vehicle {
    public void printSound() {
        System.out.print("vehicle");
    }
}

class Car extends Vehicle {
    public void printSound() {
        System.out.print("car");
    }
}

class Bike extends Vehicle{ // also tried to extend Car
    public void printSound() {
        System.out.print("bike");
    }
}

public class Test {
    public static void main(String[] args) {
        Vehicle v = new Car();
        Bike b = (Bike)v;
        v.printSound();
        b.printSound();

        Object myObj = new String[]{"one", "two", "three"};
        for (String s : (String[])myObj) System.out.print(s + ".");


    }
}

このコードを実行するClassCastExceptionと、 inheritance.Car cannot be cast to inheritance.Bike.

次に、行を見てくださいObject myObj = new String[]{"one", "two", "three"};Vehicle v = new Car();この行は右と同じですか?両方の行で、サブクラス オブジェクトをスーパー クラス参照変数に割り当てています。ただし、ダウンキャストString[]myObjは許可されていますが、許可されてい(Bike)vません。コメントで述べたように、自転車を使用して車を拡張しようとしました。ここでのいくつかの議論によると、自転車は乗り物を拡張しているため、車ではありません。Car を Bike で拡張すると、Bike が Car の一種であることを意味しますが、それでも例外は残ります。

この辺りで何が起こっているのかを理解するのを手伝ってください。

Ps - 車から自転車へ、自転車から車への変換をそのまま受け取らないでください ;)

4

3 に答える 3

2

2つは同じではありません:インスタンスである(String[])myObjため許可されます。ただし、はまたはそのスーパークラスのインスタンスではないため(インスタンスです)、許可されていません。myObjString[](Bike)vvBikeCar

于 2012-09-03T21:36:06.110 に答える
2

2 つの例の主な違いは、Object myObj = new String[]{"one", "two", "three"};ここmyObjでは文字列の配列を参照することです。参照される値は実際には文字列の配列であるため、1 つにキャストできます。他の例Bike b = (Bike)v;では、参照される値はbになりますCar。そして以来Car、完全ではありませんBike。自転車は車よりも多くのことを実装する可能性があり、車が知らないことです。Carしたがって、 aをa にキャストすることはできませんBike

于 2012-09-03T21:29:14.780 に答える
0

いいえ、提供されるコードは、基本的な文の例のコードとは異なります。

//you're declaring a Object class variable
Object myObj = new String[]{"one", "two", "three"};
//you're declaring a Car class instance, not a Vehicle
Vehicle v = new Car();

それらは同じではありません。最初の例では、親クラスを使用して値を保存しています。2 番目の例では、子クラスを使用して親の値を割り当てていますが、オブジェクトは親ではなく子になります。

さらに説明するために、クラスの構成を見てみましょう。

Object
- String[]
- Vehicle
  - Car
  - Bike

ご覧のとおり、everyString[]は aObjectになり、everyは a にCarなりますVehicleが、aCarは a ではありませんBike。コードで説明する

Vehicle v = new Car();
//v contains an instance of Car
Car c = v;
//a Car is not a Bike, this line will throw an error
Bike b = c;
//v2 contains an instance of Vehicle
Vehicle v2 = new Vehicle();
//a Car is a Vehicle
Car c2 = v2;
//a Bike is a Vehicle
Bike b2 = v2;
于 2012-09-03T21:20:58.513 に答える