2016-05-29 2 views
1

クラスCarのオブジェクトをクラスFastCarのオブジェクトに変更したいとします。この場合、メインメソッドがエラーを返すことは容易にわかります。私はそれを書いて簡単に私の質問を表現する:スーパークラスのオブジェクトの周りにサブクラスのオブジェクトを構築する方法はありますか?以下の例のようにクラスが小さくないと考えている最善の方法はありますか? 解決策は、多くのフィールドを持つ大きなクラスでも機能するはずです。オブジェクトクラスをJavaのサブクラスに変更する

public class Car { 
     String name; 
     String label; 
     Car(String name){ 
      this.name = name; 
      label = "Car"; 
     } 

     Car(){ 
      this("dafaultCarName"); 
     } 
    } 

    public class FastCar extends Car{ 
     String howFast; 
     FastCar(){ 
      howFast = "veryFast"; 
     } 
     FastCar(String name){ 
      super(name); 
      howFast = "veryFast"; 
     } 
    } 

    public static void main(String[] args) { 
      FastCar fast; 
      Car car = new Car("FastCarName"); 
      fast = (FastCar) car; 
    } 

UPDATE
@Arthurが言ったように:ラベルが保存されていないため@Arthurによって提案FastCarから

public class Car { 
    String name; 
    String label; 
    Car(String name){ 
     this.name = name; 
     label = "Car"; 
    } 

    Car(){ 
     this("dafaultCarName"); 
    } 
} 

public class FastCar extends Car{ 
    String howFast; 
    FastCar(){ 
     howFast = "veryFast"; 
    } 
    FastCar(String name){ 
     super(name); 
     howFast = "veryFast"; 
    } 

    FastCar(Car car){ 
     super(car.name); 
    } 
} 

public static void main(String[] args) { 
     FastCar fast; 
     Car car = new Car("FastCarName"); 
     car.label = "new Label"; 
     fast = new FastCar(car); 
     System.out.println(fast.label); 
    } 

コンストラクタは良いものではありません。
出力はCarですが、私はそれがnew Labelであると予想しました。 データを失うことなく、自分の「車」を「速い車」に変換するトリックが欲しいです。また、このトリックも大規模なクラスでは効率的です。

答えて

3

意気消沈行うにはいくつかの方法があります。

  1. FastCarクラスのコンストラクタFastCar(Car car)を追加します。
  2. クラスの方法public FastCar asFastCar()を導入してください。
  3. utilメソッドpublic static FastCar castToFastCar(Car car)を導入してください。
+0

これらの方法は大きなクラスにも適していますか? – webpersistence

+1

また、私はダウンキャストだと思います。 – webpersistence

+0

はい、ダウンキャストです –

1

次の行を記述する場合:

car = fast; 

Javaが自動的にuppercastingを行いますので、あなたがてmanualyそれを行う必要はありません。で

FastCar fastCar3 = (FastCar)car2;//now you can access the moethods of FastCar class with the car2 object. 

:あなたはこのようにダウンキャストする必要があるのCaR2オブジェクトとFastCarクラスのメソッドにアクセスするために今すぐ

Car car = new Car(); 
FastCar fastCar = new FastCar(); 
FastCar fastCar2 = new Car();//you cant do this since Car is the Superclass of Fast car 
Car car2 = new FastCar();//this is right 

たぶん、何がやりたいことは、このようなものです一般的には、スーパークラスのオブジェクトが、前のケースから実行されたサブクラスのオブジェクトによって参照されるようにすることはできません。

+0

私はこれがダウンキャストだと思いますか? – webpersistence

+0

うん、私は名前と混同して申し訳ありません。 – theVoid

+0

多分私は質問をとてもうまく表現していないかもしれません。私は "速い車"を持っていません。私は「車」を持っていて、「速い車」にしたいと思っています。 – webpersistence

1

これを行う最良の方法については完全にはわかりませんが、それを実行する方法の1つは、FastCarクラスの引数としてCarオブジェクトを作成し、そこからすべての変数を追加することです。あるいは、CarクラスがFast Carコンストラクタの中に設定した変数を取り込みます。

// FastCar class 
FastCar(Car car){ 
    super(car.name); 
} 

FastCar(String name){ 
    super(name); 
} 
+0

これらのコンストラクタは、名前フィールドのみを保持します。私はすべてを(ラベルを含む)保持したい。 – webpersistence

+0

'label = car.label;' – Arthur

+0

スーパー(car.name)の後に置く – Arthur

関連する問題