Java Hashcode von toString() Methode "entfernen"

violentviper

Lt. Commander
Registriert
Mai 2008
Beiträge
1.778
Hallo,
ich habe zu Übungszwecken ein kleines Java Programm geschrieben, welches die Fläche von einem Dreieck, Kreis und Rechteck ausrechnet.
Nun habe ich bei der Ausgabe , welche über eine generierte toString() Methode erfolgt imm den Hashcode bei dem Formnamen dabei, welchen ich gerne entfernen möchte.
In der Ausgabe erscheint es dann so :

Code:
Triangle@7d4991ad Area: 3,000 m²
Circle@28d93b30 Area: 7,025 m²
Rectangle@1b6d3586 Area: 15,000 m²



Ich weiß das man Java überlisten kann indem man die toString Methode überschreibt, jedoch habe ich die Anleitungen dazu noch nicht so richtig verstanden. Andere Möglichkeiten, evtl. einfachere sind aber auch gerne gehört :)


Code:
import java.text.*;
public class ShapeT{
    
	public static void main(String args[]){
    
    	DecimalFormat f = new DecimalFormat("#0.000");      

    Shape s[] = new  Shape[3];
    s[0] = new Triangle(3, 2);
    s[1] = new Circle(5);;
    s[2] = new Rectangle(5,3);

    for(Shape shape:s){
        System.out.println(shape.toString()+" Area: "+f.format(shape.getArea())+" m²");  	
        	
    }
    }

	@Override
	public String toString() {
		return "Triangle";
	}
}

Code:
abstract class Shape {

    abstract double getArea();

}

class Rectangle extends Shape{
    double h, w;

    public Rectangle(double h, double w){

        this.h = h;
        this.w = w;
    }

    public double getArea(){
        return h*w;
    }
}

class Circle extends Shape{
    double radius;

    public Circle(double radius){
        this.radius = radius;
    }

    public double getArea(){
        return Math.PI * Math.sqrt(radius);
    }
}

class Triangle extends Shape{
    double b, h;

    public Triangle(double b, double h){
        this.b = b;
        this.h = h;
    }

    public double getArea(){
        return (b*h)/2;
    }

}
 
In deiner Main Methode rufst du ja die toString Methode der Shape-Objekte auf, d.h. diese Methode muss überschrieben werden. Momentan überschreibst du die toString Methode von ShapeT.
D.h. in jeweils Rectangle, Circle und Triangle muss die Methode eingefügt werden.

Exemplarisch für Triangle:
Code:
class Triangle extends Shape{
   double b, h;
 
   public Triangle(double b, double h){
      this.b = b;
      this.h = h;
   }
 
   public double getArea(){
      return (b*h)/2;
   }

   @Override
   public String toString() {
      return "Triangle";
   }
 
}

Da du ja sagtest du verstehst die Anleitung nicht: Was genau ist dein Verständnisproblem? Hapert es evtl daran was Überschreiben überhaupt bedeutet? Falls ja, hier eine Kurzerklärung:
Wenn eine Klasse A von einer anderen Klasse B erbt (extends), dann sind auch alle Methoden der Oberklasse B in A verfügbar. Nun kann man eine Methode mit der selben Signatur, also Name, Parameter und Rückgabetyp, in Klasse A schreiben, welche dann statt der Methode aus der Oberklasse verwendet wird. Das ist Überschreiben.
 
Zuletzt bearbeitet:
Danke, das hat problemlos funktioniert. Ist aber trotzdem nervig, wenn man mal mehrere Klassen haben sollte, das für jede zu machen.
 
Du könntest das etwas schöner machen, in dem du die toString Methode allgemeingültiger formulierst:
Code:
abstract class Shape {

   private String shapeName = "Shape";

   abstract double getArea();
 
   @Override
   public String toString() {
      return shapeName;
   }
}

Und dann in den jeweiligen Implementierungen dann nur den Wert von shapeName anpasst:
Code:
class Triangle extends Shape{
   double b, h;
   private shapeName = "Triangle";

   public Triangle(double b, double h){
      this.b = b;
      this.h = h;
   }
 
   public double getArea(){
      return (b*h)/2;
   }
 
}
 
Bccc1 schrieb:
Du könntest das etwas schöner machen, in dem du die toString Methode allgemeingültiger formulierst:

Damit man nicht vergisst, das Attribut anzupassen, würde ich allerdings das Setzen erzwingen. private ist auch nicht der richtige Modifier. Damit wird das Attribute im obigen Fall nicht überschrieben (In meinem Beispiel könnte man auch private verwenden, dann kann man in abgeleiteten Klassen nicht direkt darauf zugreifen).

Code:
abstract class Shape {
    protected final String shapeName;
     
    protected Shape(String name) {
        shapeName = name;
    }

    public abstract double getArea();

    @Override
    public String toString() {
        return shapeName;
    }
}
 
s = s.substring(s.indexOf('@'),s.length)? Wahlweise mit OOP arbeiten und abstrakte Oberklasse nutzen.

Der Hash hat seine Daseinsberechtigung.
 
Danke für die Vorschläge, das mit dem Substring ist mir aber (noch) zu kompliziert.
 
Zurück
Oben