3
public class Car {

    String color;

    public void thisIs(){
        System.out.println("Calling method from Car: the color is " + color);
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

public class BMW extends Car {

    public void thisIs(){
        System.out.println("Calling method from BMW: the color is " + color);
    }
    public Car toCar(){
    Car newCar = new Car();
    newCar.setColor(this.color);
    return newCar;
}

}

public class AbstractTest {

    public static void main(String args[]){
        Car aCar = new Car();
        aCar.setColor("Red");
        aCar.thisIs();

        BMW aBMW = new BMW();
        aBMW.setColor("Black");
        aBMW.thisIs();

        //Car aaCar = new Car();
        //aaCar = (Car)aBMW;
        //aaCar.thisIs();

            Car aaCar = aBMW.toCar();
    aaCar.thisIs();
    }
}

結果は次のようになると思います。

車からの呼び出し方法:色は赤

BMWからの呼び出し方法:色は黒です

車からの呼び出し方法:色は黒です

しかし、私が得た結果は次のとおりです。

車からの呼び出し方法:色は赤

BMWからの呼び出し方法:色は黒です

BMWからの呼び出し方法:色は黒です

私はどこが間違っていますか?また、スーパークラスのメソッドを使用してサブクラスオブジェクトのデータを取得するにはどうすればよいですか?toCar()これを行うためにBMWクラスでメソッドを書くことができます。しかし、なぜキャストが機能しないのですか?よろしくお願いします!

わかった!ありがとうございました!

キャストが機能しない理由がわかりました。

そこで、BMW toCar()にメソッドを追加して、必要な結果を取得します。

4

5 に答える 5

14

オブジェクトをキャストしても、オブジェクトの性質は変わりません。それはまだBMWのオブジェクトです。キャストは、それをCarオブジェクトであるかのように扱うようにコンパイラに指示するだけです。

継承の問題に取り組んでいる限り、スーパークラスとサブクラスの両方にcolor変数またはget/setColorメソッドを配置する必要はありません。それらを車のクラスに入れるということは、それらがどのサブクラスでも利用できることを意味します。それらは不要であり、サブクラスでは少し混乱します。私はそれらを完全に取り出します。

于 2013-01-04T04:25:56.453 に答える
1

これは、実行時のポリモーフィズムが原因です。最後のステートメントは、BMWオブジェクトを指す車の参照がある場合でも(キャストすることによってオブジェクトの性質を変更することはありません!BMWはBMWのままであり、車のオブジェクトにはなりません!)、最終的にはBMWのthisIsです。 ()呼び出されるメソッド!これは動的メソッドディスパッチとして知られています

于 2013-01-04T04:22:47.600 に答える
1

あなたがそれを車と呼んでも、BMWはまだBMWです。

キャストはオブジェクトが何であるかを変更しません。それはあなたがそれをどのように扱うつもりかをコンパイラに伝えるだけです。thisIsあなたはBMWを作成しましたが、そのメソッドを呼び出すと、それはまだ1つです。

于 2013-01-04T04:25:26.387 に答える
0

さて、あなたは車のタイプにする必要はありません、なぜならaexplicitly castは(BMWか何か)だからです。したがって、コンパイラによってを割り当てる場合。あなたの場合、あなたはです。BMW objectBMW objectsubclass of Car and a Car can be of any typeBMW object to a car the implicit casting is doneexplicitly asking the compiler to cast the BMW object to car type

また、この暗黙のキャストは、BMWオブジェクトがそのthisIs()メソッドまたはその他のプロパティを失うことを意味するものではありません。

于 2013-01-04T05:07:18.843 に答える
-1

次のコードを検討してください。

public void someMethod(Car c) {
  c.thisIs(); 
}

'c'は、すべてのサブクラスの参照を保持できます。'c'によって保持されている参照は、そのメソッドが呼び出されます。ランタイムポリモーフィズムとも呼ばれます。

于 2013-01-04T04:25:49.857 に答える