webentwicklung-frage-antwort-db.com.de

Java-Überladung vs. Überschreiben

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 unterschiedlichen Anzahl von Argumenten oder unterschiedlichen Datentypen verwenden können. d.h.

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 überladen betrachtet, da es einen anderen Datentyp zurückgibt?

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

Die zweite Frage lautet: Was überschreibt In Java? Bezieht es sich auf Vererbung? Lass mich folgendes haben:

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

Nehmen wir also an, ich habe folgendes

Truck truck = new Truck();

wenn ich anrufe 

truck.super.getPrice()

dies würde den Preis von der Fahrzeugklasse 20.000 zurückgeben

wenn ich anrufe

truck.getPrice()

dies würde den Preis in der LKW-Klasse 14.000 zurückgeben

Ist mein Wissen für beide Fragen richtig?

16
user69514

Du bist im Grunde richtig. Überladen besteht aus mehreren Methoden in einer einzigen Klasse, bei der die Methode denselben Namen hat. Der Rückgabewert wird jedoch nicht als Teil der Signatur der Methode angesehen. Daher können Sie eine Methode nicht überladen, indem Sie nur den Rückgabewert ändern. Sie können aus Ihrem Beispiel nicht den folgenden Code verwenden:

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

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

Dies wird nicht kompiliert.

Wie Rob festgestellt hat, meine ich, dass Sie überschreiben meinen, 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 Basisklassenmethode zurückgeben. Vor Java 5 muss es sich um einen identischen Typ handeln. Das heißt, Sie können das Folgende erst ab Java 5 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 ();
    }
}

Selbst in Java 5 und später können Sie nicht Folgendes tun:

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

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

Ein großer Unterschied zwischen Überladen und Überschreiben, der oft übersehen wird, besteht schließlich darin, dass die Überladung zur Kompilierzeit und die Überschreibung zur Laufzeit entschieden wird. Dies überrascht viele Menschen, wenn sie davon ausgehen, dass eine Überlastung zur Laufzeit entschieden wird.

32
Eddie

Richtig; Überladen bietet mehrere Signaturen für dieselbe Methode.

Überschreiben, das ist, was Sie unter "Überschreiben" zu verstehen meinen, ist die Bereitstellung einer anderen Implementierung einer Methode, die von einem Basistyp geerbt wurde, und ist im Wesentlichen der Punkt des Polymorphismus durch Vererbung, d.

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)
    }
}
6
Rob

was du beschrieben hast, ist richtig.

Für weitere Erläuterungen sehen Sie sich das Polymorphismus-Konzept an. Die Wikipedia hat einen guten Artikel

http://en.wikipedia.org/wiki/Polymorphism#Computing

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

0
Luixv