0

この場合、CarSubClass のオーバーライド/追加メソッドにアクセスできますか?

public Car getCar(){
CarSubClass carSub = new CarSubClass();
return carSub;
}

アップデート:

Car にはサブクラス SubClass1、SubClass2、SubClass3 があります。

getCar() は、SubClass1、SubClass2、または SubClass3 を返すことができます。

これを行うことができますか?:

Car car = getCar();

switch(car.getType()){//getType() returns a byte

case SubClass1:

SubClass1 car1 = (SubClass1)car;
break;

case SubClass2:
SubClass car2 = (SubClass2)car;
break;

case SubClass3:
SubClass3 car3  =(SubClass3)car;
break;

default: //don't do anything

}
4

3 に答える 3

1

オーバーライドされたメソッドのみ:

Car car  = getCar();
car.method(); // here you can invoke only the overridden methods in CarSubClass

CarSubClass参照型が認識していない追加のメソッドを呼び出すことはできませんCarコンパイル中に失敗します。

おそらくこれは可能ですが、ここで何をしているのかを確認する必要があります。

CarSubClass c = (CarSubClass)getCar();
c.subClassSpecificMethod();

メソッドは常に のインスタンスを返すため、上記のキャストはあなたのケースでは安全ですCarSubClass。ただし、チェックを実行することをお勧めします。

Car c = getCar();
if(c instanceof CarSubClass){
    ((CarSubClass)c).subClassSpecificMethod();
}

switch(c.getType())

これは有効な切り替えキーではありません。

JLS§14.11 :

Expression の型は、char、byte、short、int、Character、Byte、Short、Integer、String、または列挙型 (§8.9) である必要があります。そうしないと、コンパイル時エラーが発生します。

于 2013-08-01T13:53:00.937 に答える
1

はい、動的な入力/呼び出しを通じて利用できます。これがポリモーフィズムの目的です。

ただし、Car インスタンスを返すため、'getCar()' を呼び出すクラスは、最初にそれを 'CarSubClass' にキャストする必要があります。

車.java

public class Car {

public void a() {
    System.out.println("In Car");
}

}

CarSubClass.java

enter code herepublic class CarSubClass extends Car {

@Override
public void a() {
    System.out.println("In CarSubClass");
}

public static void main(String[] args) {
    Car c = new CarSubClass();
    c.a();
}

}

出力します:

'In CarSubClass'

編集:回答を編集しました。この概念全体をポリモーフィズムと呼びます。実行時に、変数が保持する動的な型により、正しいメソッドが呼び出されることが保証されるため、キャストする必要はありません。

于 2013-08-01T13:53:09.327 に答える