Vererbung equals-Methode bei Vererbung abstrakter Klassen

Knusper92

Mitglied
Hallo Leute :),

Hab hier ein kleines Problem beim Verständnis einer Übungsaufgabe. Zunächst einmal die Aufgabenstellung:

Ich soll eine abstrakte Klasse mit Namen "Figuren3D" erzeugen. In dieser Klasse sollen sich die Attribute "Name" und "Gewicht" befinden, und die Methode "getVolumen". Zudem sollen die Methoden "equals" und "toString" überschrieben werden. Anschließend sollen die Klassen "Quader", "Kugel" und "Pyramide" von "Figuren3D" erben. Die Unterklassen erhalten zudem figurenspezifische Attribute (Länge, Breite, Höhe und Radius) und Konstruktoren.

Nun soll eine Testklasse "TestFiguren3D" geschrieben werden, welche drei verschiedene Figuren erstellt und als Array speichert. Die "equals"-Methode soll abschließend alle Figuren miteinander vergleichen und den Namen der Figur mit dem höchsten Gewicht ausgeben.

Ich poste zunächst mal den Code aller 5 Klassen:

Figuren3D

Java:
public abstract class Figuren3D{
    
//Attribute---------------------------------------------------------------------    
    String name;
    double gewicht;

//Methoden----------------------------------------------------------------------    
    public abstract double getVolumen();
    
    @Override 
    public boolean equals(Object figur){
        if (figur instanceof Figuren3D){
            Figuren3D f = (Figuren3D) figur;
            return (gewicht == f.gewicht);
        }
        return false;
    }
    
    @Override   
    public String toString(){
        return "Objekt: " + this.name + ", Gewicht: " + this.gewicht + ", Volumen: " + this.getVolumen();
    }
    
}

Quader

Java:
public class Quader extends Figuren3D {
    
//Attribute---------------------------------------------------------------------    
    double breite;
    double laenge;
    double hoehe;
    
//Methoden----------------------------------------------------------------------    
    @Override
    public double getVolumen(){
        return breite * laenge * hoehe;
    }

//Konstruktoren-----------------------------------------------------------------    
    public Quader(){
        name    = "standard";
        breite  = 
        laenge  =
        hoehe   = 1;
        gewicht = 1;
    }
    
    public Quader(String n, double b, double l, double h, double g){
        this.name    = n;
        this.breite  = b;
        this.laenge  = l;
        this.hoehe   = h;
        this.gewicht = g;
    }
    
}

Kugel

Java:
public class Kugel extends Figuren3D {
    
//Attribute---------------------------------------------------------------------
    double radius;
    
//Methoden----------------------------------------------------------------------
    @Override
    public double getVolumen(){
        return (4/3) * Math.PI * Math.pow(radius, 3);
    }
    
//Konstruktoren-----------------------------------------------------------------    
    public Kugel(){
        name    = "standard";
        radius  = 1;
        gewicht = 1; 
    }
    
    public Kugel(String n, double r, double g){
        this.name    = n;
        this.radius  = r;
        this.gewicht = g;
    }
        
}

Pyramide

Java:
public class Pyramide extends Figuren3D {
    
//Attribute---------------------------------------------------------------------
    double breite;
    double laenge;
    double hoehe;
    
//Methoden----------------------------------------------------------------------    
    @Override
    public double getVolumen(){
        return (1/3) * hoehe * breite * laenge;
    }
    
//Konstruktoren-----------------------------------------------------------------    
    public Pyramide(){
        name    = "standard";
        breite  = 
        laenge  =
        hoehe   = 1;
        gewicht = 1;
    }
    
    public Pyramide(String n, double b, double l, double h, double g){
        this.name    = n;
        this.breite  = b;
        this.laenge  = l;
        this.hoehe   = h;
        this.gewicht = g;
    }
}

Java:
public class TestFiguren3D {
    
    public static void main(String[] args) {
        
        Figuren3D[] f = new Figuren3D[3];
        
        f[0] = new Quader("Quader_1", 5.5, 6.7, 2.1, 36.2);
        f[1] = new Kugel("Kugel_1", 4.5, 66.2);
        f[2] = new Pyramide("Pyramide_1", 2.3, 3.7, 6.3, 36.2);
        
        System.out.println(f[0]);
        System.out.println(f[1]);
        System.out.println(f[2]);
        
        if(f[0].equals(f[1])) { 
                System.out.println("Figur 1 und 2 sind gleich!");
        } 
        if(f[0].equals(f[2])) { 
                System.out.println("Figur 1 und 3 sind gleich!");
        }
        if(f[1].equals(f[2])) { 
                System.out.println("Figur 2 und 3 sind gleich!");
        }
        if(!(f[0].equals(f[1]) || f[0].equals(f[2]) || f[1].equals(f[2])))
            System.out.println("Alle Figuren haben unterschiedliche Gewichte.");
    }
}

Ich verstehe nicht, warum in der Klasse "Figuren3D" bei dem Überschreiben der equals-Methode hinter dem
Java:
return (gewicht == f.gewicht);
noch ein
Java:
return false;

Was macht das return false?

Danke schon mal für die Antworten und ich hoffe, dass das Beantworten der Frage nicht zu viel Zeit in anspruch nimmt! ;)
 
N

nillehammer

Gast
Java:
        if (figur instanceof Figuren3D){
            Figuren3D f = (Figuren3D) figur;
            return (gewicht == f.gewicht);
        }
        return false;
Verstehst Du den if-Zweig? Wann ist instanceof true? Und unter welchen Umständen ist es false? Wenn es false ist, wird der if-Zweig ja nicht betreten. Warum ist es dann sinnvoll, false zu returnen?

P.S. Der Parametername figur ist sehr unglücklich, weil er impliziert, dass immer eine Figur übergeben wird. Dem ist aber nicht so. equals kann mit allem als Parameter aufgerufen werden. Nenne den Parameter darum besser obj oder so.

P.P.S. Abgesehen davon ist es in nicht finalen Klassen eine ziemlich schlechte Idee, mit instanceof zu prüfen. Aber in die Tiefen des equals-Kontrakts soll hier ja wohl nicht eingestiegen werden...
 
Zuletzt bearbeitet von einem Moderator:

vimar

Bekanntes Mitglied
ich denke für deine frage muss man sich ja nur die erste klasse ansehen. du hast da ne methode
Code:
 public boolean equals(Object figur){
die einen boolean zurückgibt (true oder false). mit return wird ja in diesem fall true oder false zurückgegeben.

Java:
if (figur instanceof Figuren3D){
            Figuren3D f = (Figuren3D) figur;
            return (gewicht == f.gewicht);
        }
das return dort wird ja nur zurückgegeben falls instanceof Figuren3d true ist. falls es nun keine instance ist, muss ja dennoch irgendwas zurückgegeben werden. und deswegen steht da
Code:
return false;

anmerkung: du solltest wissen dass wenn das hier passiert
Code:
 return (gewicht == f.gewicht);
dass der -direkt- aus der methode "rausspringt", also den rest nicht mehr macht egal was noch kommt. d.h. wenn instanceof Figuren3d true ist, kommt das programm niemals zu
Code:
 return false;
 
Zuletzt bearbeitet:

Knusper92

Mitglied
Wow danke für die schnellen Antworten! :)

@nillehammer

Ja den verstehe ich. Aufgrund der uns gegebenen Aufgabe ist mir auch gar nicht in den Sinn gekommen, dass es auch sein könnte, dass die geprüfte Klasse auch was anderes sein könnte als ne Unterklasse von "Figuren3D" :D Jetzt ergibt alles Sinn^^

Keine Ahnung unser Prof hat uns halt erzählt, dass man damit schaut, ob es überhaupt Sinn macht die Klassen per equal zu vergleichen.

@vimar

Ahh alles klar das war nochmal wichtig mit dem rauspringen ;) Danke!
 

Timothy Truckle

Top Contributor
Keine Ahnung unser Prof hat uns halt erzählt, dass man damit schaut, ob es überhaupt Sinn macht die Klassen per equal zu vergleichen.
Dass stimmt auch. Wenn die Objekte nicht vom selben Typ sind können sie auch nicht gleich sein.

Dass Problem: wenn die Objekte vom selben abstrakten Typ sind kann können sie trotzdem nicht vergleichbar sein: Äpfel kann man eben nicht mit Birnen vergleichen, obwohl beides Obst ist. Ganau dasswürde
Code:
equals()
in einer abstrakten Klasse tun....

bye
TT
 
N

nillehammer

Gast
Keine Ahnung unser Prof hat uns halt erzählt, dass man damit schaut, ob es überhaupt Sinn macht die Klassen per equal zu vergleichen.
Das stimmt, mit instanceof kann man verhindern, dass Äpfel mit Birnen verglichen werden. Praktischerweise wird auch gleich der null-Fall mit geprüft. Aber er ist zu lachs, da er eben auch für Unterklassen true zurück liefert. Bei nicht finalen Klassen sieht der erste Teile der equals-Methode immer so aus:
Java:
// Abkürzung, wenn identisch:
if(this== obj) {
  return true;
}
// wenn null oder nicht vergleichbar, Klassenvergleich statt instanceof
if(obj == null || obj.getClass() != this.getClass) {
  return false;
}
// jetzt der ganze Fachkram
...
Falls Du nicht nur den Schein haben willst, sondern ernsthaft mit Java arbeiten willst, empfehle ich folgenden Link: AngelikaLanger.com - Implementing the equals() Method - Part 2 - Angelika Langer Training/Consulting

Auch ihre anderen Artikel sind sehr lesenswert.
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Timothy Truckle hat gesagt.:
Dass Problem: wenn die Objekte vom selben abstrakten Typ sind kann können sie trotzdem nicht vergleichbar sein: Äpfel kann man eben nicht mit Birnen vergleichen, obwohl beides Obst ist. Ganau dasswürde equals() in einer abstrakten Klasse tun....
Sehr gut auf den Punkt gebracht!
 

Knusper92

Mitglied
Jo denke ich hab das Problem verstanden! Den Link habe ich mir gespeichert und werde mal ein bisschen lesen wenn ich mit meinen Prüfungen durch bin. Java soll nen neues Hobby von mir werden, will vllt so nen paar Programme oder Apps für mein Smartphone schreiben aber will das schon vernünftig lernen werd mir die Tipps zu Herzen nehmen!

So danke noch mal und schönen Abend ;)
 
N

nillehammer

Gast
Java soll nen neues Hobby von mir werden,
Herzlichen Glückwunsch! Dann hast Du Dich für eine lange Periode des Frusts entschieden ;) Ich hab glaub ich locker nen Jahr (wenn nicht sogar mehr) Java "programmiert", bis ich so langsam verstanden habe, was ich da eigentlich mache, mit dem entsprechenden Frustfaktor natürlich :autsch:

Aber tröste Dich, danach kann es durchaus Spaß machen.:toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J compareTo()- und equals-Methode Java Basics - Anfänger-Themen 3
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
G Java equals() Methode Java Basics - Anfänger-Themen 9
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
H equals methode Java Basics - Anfänger-Themen 1
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
H equals Methode Java Basics - Anfänger-Themen 1
S equals Methode bei String Java Basics - Anfänger-Themen 5
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
E Equals-Methode auf Class-Object Java Basics - Anfänger-Themen 17
J Methode equals() Java Basics - Anfänger-Themen 7
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
C 2 Objekte (mathematisch) vergleichen in der equals Methode Java Basics - Anfänger-Themen 10
C hilfe bei equals Methode - es geht ums Bestehen Java Basics - Anfänger-Themen 7
G equals-Methode Java Basics - Anfänger-Themen 4
Say Equals Java Basics - Anfänger-Themen 6
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
lallmichnichtzu Methoden Überladen des .equals-Operators Java Basics - Anfänger-Themen 6
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
E equals Prüfung fehlgeschlagen Java Basics - Anfänger-Themen 3
C Objekt equals Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
F String equals NULL Problem Java Basics - Anfänger-Themen 4
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
E Calender - Equals Problem Java Basics - Anfänger-Themen 14
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
S compareTo() und equals() Java Basics - Anfänger-Themen 6
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
K Cast bei equals Java Basics - Anfänger-Themen 2
T SQL equals Java Basics - Anfänger-Themen 4
OnDemand Methoden Equals Methde Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
K String - Equals Java Basics - Anfänger-Themen 2
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
S Verständnissfrage equals() Java Basics - Anfänger-Themen 2
R compareTo & equals Java Basics - Anfänger-Themen 10
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
W Stringvergleich mit equals Java Basics - Anfänger-Themen 13
C equals() Java Basics - Anfänger-Themen 4
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
T Problem mit der while(!string.equals("x")) Java Basics - Anfänger-Themen 2
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
M Equals überschreiben Java Basics - Anfänger-Themen 3
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
T equals() und hashCode() Java Basics - Anfänger-Themen 7
D probs mit clone und equals Java Basics - Anfänger-Themen 10
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
N Vergleich per equals Java Basics - Anfänger-Themen 5
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zu Textvergleich (equals) Java Basics - Anfänger-Themen 8
G Strings vergleichen mit equals, geht das kürzer? Java Basics - Anfänger-Themen 4
B Frage zu Funktion mit equals Java Basics - Anfänger-Themen 17
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
D "2010–03–12".equals( "2010-03-12" ) Java Basics - Anfänger-Themen 6
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
T Problem mit equals Java Basics - Anfänger-Themen 5
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
S equals vergleich Java Basics - Anfänger-Themen 10
H Equals hascode Java Basics - Anfänger-Themen 5
S Equals Downcast? Java Basics - Anfänger-Themen 11
D equals Vergleiche Java Basics - Anfänger-Themen 7
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
P Toleranz bei equals Java Basics - Anfänger-Themen 4
B Frage zu equals() und hashCode() Java Basics - Anfänger-Themen 28
D String#equals + String#charAt Java Basics - Anfänger-Themen 5
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
G mehrere Werte für .equals ? Java Basics - Anfänger-Themen 22
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben