# Klasse Zylinder



## Dilay123 (6. Feb 2021)

Hey Leute,

Mein Professor hat mir uns eine Hausaufgabe aufgegeben wo ich nicht wirklich Ahnung habe wie ich das Programmieren sollte, da ich leider an dem Tag wo die das durchgemacht haben krank war. Ich würde mich freuen, wenn ihr mir helfen könntet. Natürlich will ich von euch nicht, dass ihr die ganze Hausübung für mich macht.

Die Hausübung lautet:
Erstellen Sie eine Klasse Zylinder in objektorientierter Programmierung.
Die Klasse soll 2 überladene Konstruktoren enthalten. Erzeugen Sie mindestens 4 Objekte in der main-Methode. Methoden für die Berechnung der Grundfläche, des Volumens, der Mantelfläche  und der Oberfläche sollen entwickelt werden. Weiters sollen Methoden equals(Zylinder z) und anzeigen() programmiert werden. Alle Methoden sollen getestet werden. 

Ich freu mich schon auf eure Antworten 

LG Dilay


----------



## White_Fox (6. Feb 2021)

Wie soll man dir helfen wenn du nicht sagst, wo es klemmt?

Und "java vererbung" in die Suchmaschine deines geringsten Mißtrauens einzugeben kriegst du doch wohl noch hin - Studium hat vor allem etwas mit Selbermachen zu tun.


----------



## temi (6. Feb 2021)

Wo ist denn da Vererbung?

@Dilay123: Fang doch einfach mal an und frag an den Stellen, wo du konkrete Schwierigkeiten hast.


```
public class Zylinder {
    
    // your playground!
    
}
```


----------



## mihe7 (6. Feb 2021)

Dilay123 hat gesagt.:


> an dem Tag wo die das durchgemacht haben krank war


Wie lange war denn dieser Tag, dass man da imperative Konzepte, Klassen, Objekte, Instanzvariablen, Konstruktoren, Methoden, Überladung, Gleichheit und I/O behandeln konnte?!?


----------



## Dilay123 (7. Feb 2021)

mihe7 hat gesagt.:


> Wie lange war denn dieser Tag, dass man da imperative Konzepte, Klassen, Objekte, Instanzvariablen, Konstruktoren, Methoden, Überladung, Gleichheit und I/O behandeln konnte?!?



Das war nur ein Tag. Da hatte ich nur zwei Stunden Informatik


----------



## Dilay123 (7. Feb 2021)

Hey Leute, 

ich hab mal bis jetzt versucht selber etwas hinzubekommen. Bin mir leider nicht so sicher dabei. Mein Probleme gerade ist, dass bei diesen public int gets bei mir das als falsch angezeigt wird und ich weiß bei  System.out.println("Zylinder v: " + this.radiusr ); nicht was am Ende plus rechnen bin mir da nicht so sicher und hab einfach radius hingeschrieben.
Tut mir leid, dass ich dumme Fragen gerade stelle, bin erst ganz neu im programmieren :/



```
public class Zylinderr {

    private double radiusr;
    private double hoeheh;
    private double deckflaeched;
    private double pi=Math.PI;
    
    public Zylinderr(double r, double h, double d, double pi) {
        this.radiusr=r;
        this.hoeheh=h;
        this.deckflaeched=d;
        this.pi=Math.PI;
        }
    
    public void anzeigen() {
            System.out.println("Zylinder v: " + this.radiusr );
        }
        
        public int getGrundflaeche(){
            return this.pi*this.radiusr*radiusr;
        }
        
        public int getVolumen() {
            return this.pi*this.radiusr*2*this.hoeheh;
        }
        
        public int getMantelflaeche() {
            return 2*this.pi*this.radiusr*this.hoeheh;
        }
        
        public int getOberflaeche() {
            return getGrundflaeche+deckflaeched+getMantelflaeche;
        }
}
```


----------



## mihe7 (7. Feb 2021)

Dilay123 hat gesagt.:


> Das war nur ein Tag. Da hatte ich nur zwei Stunden Informatik


Mal andersrum gefragt: was habt ihr denn den Rest des Semesters gemacht? Das ist ja schon fast rum.


----------



## mihe7 (7. Feb 2021)

Dilay123 hat gesagt.:


> Mein Probleme gerade ist, dass bei diesen public int gets bei mir das als falsch angezeigt wird


Ja, das Ergebnis ist keine Ganzzahl -> nimm double als Rückgabetyp.



Dilay123 hat gesagt.:


> und ich weiß bei System.out.println("Zylinder v: " + this.radiusr ); nicht was am Ende plus rechnen bin mir da nicht so sicher und hab einfach radius hingeschrieben.


Das plus an der Stelle ist keine Rechnung. Hier wird einfach radiusr in eine Zeichenkette umgewandelt und diese an "Zylinder v: " gehangen.


----------



## Dilay123 (7. Feb 2021)

mihe7 hat gesagt.:


> Ja, das Ergebnis ist keine Ganzzahl -> nimm double als Rückgabetyp.
> 
> 
> Das plus an der Stelle ist keine Rechnung. Hier wird einfach radiusr in eine Zeichenkette umgewandelt und diese an "Zylinder v: " gehangen.


Stimmt Danke habe ich übersehen, aber jetzt hab ich da ein Problem.


```
public double getOberflaeche() {
            return getGrundflaeche+deckflaeched+getMantelflaeche;
        }
```

da steht, dass man getGrundfläche und getMantelfläche nicht als Variable annehmen. Dh ich muss das extra oben deklarieren oder?


----------



## mihe7 (7. Feb 2021)

Die Grund- und Mantelfläche wird ja von Methoden berechnet, Du musst die Methoden halt auch aufrufen: getGrundflaeche() (beachte die Klammern am Ende -> Methodenaufruf).


----------



## Dilay123 (7. Feb 2021)

Ich hab jetzt versucht, dass zu machen, aber bei return getGrundflaeche+deckflaeched+getMantelflaeche; und bei Zylinder z1 = new Zylinderr(4,5); wird mir ein Fehler angezeigt.



```
public class Zylinder {

    private double radiusr;
    private double hoeheh;
    private double deckflaeched;
    private double pi=Math.PI;
   
    public Zylinder(double r, double h, double d, double pi) {
        this.radiusr=r;
        this.hoeheh=h;
        this.deckflaeched=d;
        this.pi=Math.PI;
       
    }
   
        public void anzeigen() {
            System.out.println("Zylinder: " + this.radiusr );
        }
       
        public double getGrundflaeche(){
            return this.pi*this.radiusr*radiusr;
        }
       
        public double getVolumen() {
            return this.pi*this.radiusr*2*this.hoeheh;
        }
       
        public double getMantelflaeche() {
            return 2*this.pi*this.radiusr*this.hoeheh;
           
        }
       
        public double getOberflaeche() {
            return getGrundflaeche+deckflaeched+getMantelflaeche;
        }

    public void rotieren() {
    double z = this.radiusr;
    this.radiusr=this.hoeheh;
    this.hoeheh=z;
}

    public static void main(String[] args) {
       
        Zylinderr z1 = new Zylinder(4,5); //4,5 angenommen
       
        z1.anzeigen();
        System.out.println("Zylinder Grundfläche: " + z1.getGrundflaeche());
       
        z1.anzeigen();
        System.out.println("Zylinder Mantelfläche: " + z1.getMantelflaeche());
       
        System.out.println("Zylinder Volumen: " + z1.getVolumen());
       
        System.out.println("Zylinder Oberfläche: " + z1.getOberflaeche());
       
    }
}
```


----------



## mihe7 (7. Feb 2021)

Dilay123 hat gesagt.:


> ch hab jetzt versucht, dass zu machen, aber bei return getGrundflaeche+deckflaeched+getMantelflaeche;


Das habe ich doch vorhin geschrieben, dass Du die Methoden aufrufen musst:

```
return getGrundflaeche() + deckflaeched + getMantelflaeche();
```


----------



## LimDul (7. Feb 2021)

mihe7 hat gesagt.:


> Die Grund- und Mantelfläche wird ja von Methoden berechnet, Du musst die Methoden halt auch aufrufen: getGrundflaeche() (beachte die Klammern am Ende -> Methodenaufruf).


Da - die Klammern fehlen.


----------



## mihe7 (7. Feb 2021)

Dilay123 hat gesagt.:


> und bei Zylinder z1 = new Zylinderr(4,5); wird mir ein Fehler angezeigt.


Natürlich, Du hast ja auch keinen Konstruktor, der nur zwei Parameter hätte.


----------



## Dilay123 (7. Feb 2021)

mihe7 hat gesagt.:


> Das habe ich doch vorhin geschrieben, dass Du die Methoden aufrufen musst:
> 
> ```
> return getGrundflaeche() + deckflaeched + getMantelflaeche();
> ```


Ich hab es ja unten aufgerufen oder ist das falsch ?!


----------



## mihe7 (7. Feb 2021)

Was du irgendwo im Code machst, spielt keine Rolle. In Zeile 34 versuchst Du, auf die _Attribute_ (Instanzvariablen) getGrundflaeche und getMantelflaeche zuzugreifen. Die gibt es nicht, daher ein Fehler.


----------



## Dilay123 (7. Feb 2021)

mihe7 hat gesagt.:


> Was du irgendwo im Code machst, spielt keine Rolle. In Zeile 34 versuchst Du, auf die _Attribute_ (Instanzvariablen) getGrundflaeche und getMantelflaeche zuzugreifen. Die gibt es nicht, daher ein Fehler.


Ich verstehe nicht wie ich das machen soll :I


----------



## mihe7 (7. Feb 2021)

Das habe ich doch nun wiederholt geschrieben, in Kommentar #12 sogar als fertige Lösung.


----------



## temi (8. Feb 2021)

```
return getGrundflaeche; // Zugriff auf eine Variable (z. B. Attribut)
return getGrundflaeche(); // Zugriff auf eine Methode
```

Bei einem Zugriff auf eine Methode braucht es immer eine Klammer, entweder mit oder ohne Parametern, je nach Methode.


----------



## Dilay123 (8. Feb 2021)

Hallo Leute, 

Ich hab bemerkt dass Grundfläche und Deckfläche im Grunde das gleiche ist. Ich wollte in die Methode schreiben das Grundfläche=Deckfläche ist, aber wie mach ist das denn :I


----------



## temi (8. Feb 2021)

Dilay123 hat gesagt.:


> Ich hab bemerkt dass Grundfläche und Deckfläche im Grunde das gleiche ist.





Dilay123 hat gesagt.:


> Methoden für die Berechnung der Grundfläche, des Volumens, der Mantelfläche und der Oberfläche


Wenn dir der Begriff nicht gefällt, dann verwende ihn halt einfach nicht. Die Aufgabe erfordert ja nur Grundfläche, Mantelfläche, Oberfläche und Volumen. Oberfläche ergibt sich dann aus 2 x Grundfläche + Mantelfläche und Volumen aus Grundfläche x Höhe.


----------



## temi (8. Feb 2021)

Mal noch ein paar Gedanken...

```
public class Zylinder {

    private double radiusr;
    private double hoeheh;
    private double deckflaeched;
    private double pi=Math.PI; // 1

    public Zylinder(double r, double h, double d, double pi) { // 2
        this.radiusr=r;
        this.hoeheh=h;
        this.deckflaeched=d; // 3
        this.pi=Math.PI; // 4
   
    }

    // ...
}
```

1. Das ist überflüssig, verwende in den Berechnungen direkt die Konstante `Math.PI`
2. Wozu überhaupt "pi" als Parameter, wenn es doch eine Konstante ist (siehe 1.)?
3. Was machst du eigentlich, wenn die Fläche, die sich aus "r" ergibt, nicht der Fläche "d" entspricht?
4. Sinnlos, weil a) die Instanzvariable bereits bei der Deklaration mit "Math.PI" initialisiert wurde und b) siehe 1.

Ein senkrechter Kreiszylinder ist mit der Angabe von Radius und Höhe vollständig bestimmt. Nimmt man einen gleichseitigen Zylinder an, dann reicht sogar der Radius aus, um ihn vollständig zu bestimmen.


----------



## Dilay123 (8. Feb 2021)

Könnt ihr mir bitte sagen was da bei meine equals nicht stimmt.

```
public boolean equals (Zylinderr z) {
    Zylinderr a = (Zylinderr)z;
    
if(this.radiusr == a.radiusr  && this.hoeheh == a.hoeheh)
        
return true;
}
return false;   
    
}
```


----------



## LimDul (8. Feb 2021)

Die Klammern passen nicht - einmal eine öffnende, aber zwei schließende


----------



## Dilay123 (8. Feb 2021)

LimDul hat gesagt.:


> Die Klammern passen nicht - einmal eine öffnende, aber zwei schließende


Stimmt, hab ich leider übersehen 

Aber funktioniert leider trotzdem nicht


----------



## kneitzel (8. Feb 2021)

Dilay123 hat gesagt.:


> Aber funktioniert leider trotzdem nicht


Wie hast Du es denn verbessert? Du wirst ja irgendwas angepasst haben. Zeige und die Version, die jetzt nicht funktioniert...

Ansonsten können wir entweder anfangen zu raten oder wir können Dir lediglich sagen: Wenn es nicht funktioniert, dann hast Du etwas falsch gemacht....


----------



## kneitzel (8. Feb 2021)

Generell passt die equals Methode in keiner Weise. Du überlädst equals lediglich und überschreibst die Methode von Object nicht.

equals hat als Parameter Object.

Und dann macht man nicht einfach einen cast sondern prüft erst mittels instanceof und so. Ansonsten kommt eine ClassCastException und das ist kein gewünschtes Verhalten.


----------



## fhoffmann (8. Feb 2021)

kneitzel hat gesagt.:


> Generell passt die equals Methode in keiner Weise.


Oder anders gesagt: Folgender Code ist vollkommnen sinnlos:


Dilay123 hat gesagt.:


> Zylinderr a = (Zylinderr)z;


(Und du solltest "Zylinder" durchgehend mit einem "r" schreiben)


----------



## temi (9. Feb 2021)

fhoffmann hat gesagt.:


> Und du solltest "Zylinder" durchgehend mit einem "r" schreiben


Ich hab mich schon die ganze Zeit gefragt, ob es sich da um Wortfindungsprobleme handelt:
"Zylinderr"
"radiusr"
"hoeheh"
"deckflaeched"
"pipi" - OK, der war von mir 

Tipp: Mach diese zusätzlichen Buchstaben weg, die erschweren nur die Lesbarkeit.


----------



## temi (9. Feb 2021)

kneitzel hat gesagt.:


> Du überlädst equals lediglich und überschreibst die Methode von Object nicht.


Darum generell immer @Override verwenden. Versuch das mal:

```
@Override
public boolean equals (Zylinder z) {
    // ...  
}
```

Du solltest dir auch noch einmal die Anforderungen an equals() durchlesen: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

Für die Umsetzung dieser Anforderungen gibt es gängige Muster, die du leicht im Web finden kannst, z. B. http://www.tutego.de/javabuch/Java-...tml#dodtp848b6b5d-0c2d-464d-ac8e-4c765d194c9e


----------



## temi (9. Feb 2021)

fhoffmann hat gesagt.:


> Oder anders gesagt: Folgender Code ist vollkommnen sinnlos


Da es sich beim TO um einen Anfänger handelt, hier noch der Grund:

```
public boolean equals (Zylinderr z) { // beim Parameter z handelt es sich bereits um den Typ "Zylinderr"
    Zylinderr a = (Zylinderr)z; // darum ist es sinnlos, diesen nochmal zu einem Zylinderr zu casten
```


----------

