2016-05-29 7 views
1

Ich möchte das Objekt der Klasse Car in ein Objekt der Klasse FastCar ändern. Es ist leicht zu sehen, dass die Hauptmethode in diesem Fall einen Fehler zurückgibt. Ich schrieb es, um einfacher zu sein, meine Frage auszudrücken: Wie kann ich ein Objekt einer Unterklasse um ein Objekt einer Oberklasse bauen? Was wäre der beste Weg, wenn man bedenkt, dass die Klassen nicht so klein sind wie in den folgenden Beispielen? Die Lösung sollte auch für große Klassen mit vielen Feldern funktionieren.Ändern einer Objektklasse in eine Unterklasse in 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
Wie @Arthur sagte:

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); 
    } 

Die Konstrukteure von FastCar von @Arthur vorgeschlagen sind nicht gut, weil das Etikett nicht erhalten bleibt.
Der Ausgang ist Car, aber ich erwartete, dass es new Label ist. Ich möchte einen Trick, um mein "Auto" in ein "schnelles Auto" umzuwandeln, ohne Daten zu verlieren. Auch dieser Trick sollte auch für größere Klassen effizient sein.

Antwort

3

Es gibt mehrere Möglichkeiten gesenkten zu tun:

  1. hinzufügen Konstruktor FastCar(Car car) in FastCar Klasse.
  2. Methode public FastCar asFastCar() in Car Klasse einführen.
  3. Einführung util-Methode public static FastCar castToFastCar(Car car) überall.
+0

Sind diese Möglichkeiten auch für große Klassen gut? – webpersistence

+1

Auch ich denke, es ist niedergeschlagen. – webpersistence

+0

ja, es ist downcast –

1

Wenn Sie schreiben die Zeile:

car = fast; 

Java funktioniert die uppercasting automatisch, so dass Sie sich nicht, es händisch zu tun.

Vielleicht ist das, was Sie tun möchten, so etwas wie dieses:

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 

nun die Methoden der FastCar Klasse mit dem car2 Objekt zuzugreifen Sie wie folgt niedergeschlagenen haben:

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

In Allgemein können Sie nicht bewirken, dass ein Objekt der Unterklasse von einem Objekt einer Unterklasse referenziert wird, mit Ausnahme des vorherigen Falls.

+0

Ich denke, das ist niedergeschlagen, oder? – webpersistence

+0

ja tut mir leid, ich war mit den Namen verwirrt. – theVoid

+0

Vielleicht habe ich die Frage nicht sehr gut ausgedrückt.Ich habe kein "schnelles Auto". Ich habe ein "Auto" und ich möchte es zu einem "schnellen Auto" machen. – webpersistence

1

Ich bin nicht ganz sicher, auf die beste Weise, dies zu tun, aber eine Möglichkeit, wie Sie es tun können, ist ein Auto-Objekt als Argument für die FastCar-Klasse und dann alle Variablen von dort hinzufügen. Oder nehmen Sie die Variablen, die die Klasse Car enthält, in den Fast Car-Konstruktor ein.

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

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

Diese Konstruktoren behalten nur das Namensfeld. Ich möchte alles behalten (einschließlich des Labels). – webpersistence

+0

'label = car.label;' – Arthur

+0

das nach super setzen (car.name) – Arthur

Verwandte Themen