2009-05-08 20 views
15

Hallo Ich möchte nur sicherstellen, dass ich diese Konzepte richtig habe. Überladen in Java bedeutet, dass Sie einen Konstruktor oder eine Methode mit einer anderen Anzahl von Argumenten oder unterschiedlichen Datentypen haben können. d. h.Java überladen vs überschreiben

public void setValue(){ 
    this.value = 0; 
} 
public void setValue(int v){ 
    this.value = v; 
} 

Wie wäre es mit dieser Methode? Wird es immer noch als Überladung betrachtet, da es einen anderen Datentyp zurückgibt?

public int setValue(){ 
    return this.value; 
} 

Zweite Frage ist: Was ist in Java zu überschreiben? Bezieht es sich auf die Vererbung. Lassen Sie uns ich habe folgendes:

public class Vehicle{ 
    double basePrice = 20000; 
    //constructor defined 
    public double getPrice(){ 
    return basePrice; 
    } 
} 

public class Truck extends Vehicle{ 
    double truckPrice = 14000; 
    //constructor defined 
    public double getPrice(){ 
    return truckPrice; 
    } 
} 

So, jetzt lassen Sie uns sagen, ich habe folgendes

Truck truck = new Truck(); 

wenn ich

truck.super.getPrice() 

diese zurückkehren würde den Preis von der Fahrzeugklasse aufrufen, 20.000

wenn ich rufe

truck.getPrice() 

dies würde den Preis in der Lkw-Klasse zurückkehren, 14.000

Ist mein Wissen und Gewissen richtig für beide Fragen?

+0

Ich würde nicht setValue() verwenden, da es nicht eindeutig ist, was es setzt den Wert auf. clearValue() wäre klarer und somit nicht überladen. –

+0

du meinst überschreiben nicht überschreiben. Das Überschreiben von Methoden eines Objekts wird in JavaScript häufiger besprochen. dh. Object.toString = function() {return "Diese Funktion wurde überschrieben";}; –

Antwort

31

Sie sind grundsätzlich richtig. Das Überladen hat mehrere Methoden in einer einzigen Klasse, in der die Methode denselben Namen hat. Der Rückgabewert wird jedoch nicht als Teil der Signatur der Methode gesehen. Daher können Sie eine Methode nicht überladen, indem Sie nur den Rückgabewert ändern. Sie können nicht den folgenden Code aus Ihrem Beispiel haben:

public void setValue() { 
    this.value = 0; 
} 

public int setValue() { 
    return this.value; 
} 

Dies kann nicht kompilieren.

Wie Rob identifiziert, ich glaube, Sie meinen überschreiben, und Sie haben das richtig. Beachten Sie beim Überschreiben, dass Sie den Rückgabetyp nicht ändern können. Ab Java 5 können Sie einen abgeleiteten Typ der zurückgegebenen Basisklassenmethode zurückgeben. Vor Java 5 muss es identisch sein.Das heißt, können Sie die unten bis Java 5 und später nicht tun:

public class AnimalNoise {} 
public class Miaw extends AnimalNoise {} 

public class Animal { 
    public AnimalNoise makeNoise() { 
     return new AnimalNoise(); 
    } 
} 

public class Cat extends Animal { 
    public Miaw makeNoise() { 
     return new Miaw(); 
    } 
} 

Aber auch in Java 5 und höher, Sie nicht wie folgt vorgehen:

public class Animal { 
    public String makeNoise() { 
     return "silence"; 
    } 
} 

public class Cat extends Animal { 
    public Miaw makeNoise() { 
     return new Miaw(); 
    } 
} 
public class Miaw {} 

schließlich ein großer Unterschied zwischen Überladen und Überschreiben, das oft übersehen wird, ist, dass das Überladen zur Kompilierungszeit entschieden wird und das Überschreiben zur Laufzeit entschieden wird. Dies überrascht viele Menschen, wenn sie erwarten, dass die Überladung zur Laufzeit entschieden wird.

+1

+1 Kopf zuerst Java von Kathy Sierra, Bert Bates – abi1964

4

Korrekt; Überladen bietet mehrere Signaturen für die gleiche Methode.

Zwingende, das ist, was ich denke du meinst durch „Überschreiben“ ist der Akt des eine andere Implementierung eines Verfahrens, die aus einem Basistyp geerbt und ist im Grunde der Punkt des Polymorphismus durch Vererbung, dh

public class Bicycle implements Vehicle { 
    public void drive() { ... } 
} 

public class Motorcycle extends Bicycle { 
    public void drive() { 
     // Do motorcycle-specific driving here, overriding Bicycle.drive() 
     // (we can still call the base method if it's useful to us here) 
    } 
}