# Aufgabe zur Programmanalyse



## Burak (5. Jan 2016)

Hallo Leute, ich bin neu hier im Forum und habe gleich eine Frage bezüglich eines Java programms. Ich studiere derzeit Informatik und im ersten Semester habe ich Java, ich besitze nicht sonderlich viele Kentnisse, bin aber gerade dabei mir es beizubringen.

So viel zu mir. ich sitze derzeit an einer Altklausur und soll ein Programm analysieren und herausfinden, was die Console ausgeben würde sprich, ich soll die Konsole spielen. Nur verstehe ich paar Grundlegende Dinge nicht und würde mich freuen, wenn mir einer helfen könnte.

----------------------------------------------------------------------------------------------------------
Meine main Methode lautet:
----------------------------------------------------------------------------------------------------------

```
public class M {

   public static void main(String[] args) {
 
     A a = new A(6);
     System.out.println(a.x);
   
     int retA = a.f(1.3);
     System.out.println(retA);
   
     B b = new B(7);
     System.out.println(b.y + " " + b.z);
   
     int retB = b.f(12);
     System.out.println(retB);
   
     A ab = b;
     int retAB = ab.f(1.2f);
     System.out.println(retAB);
   }
```

----------------------------------------------------------------------------------------------------------
Klasse A
----------------------------------------------------------------------------------------------------------

```
public class A {
   public int x;
   public static int y = 0;
 
   public A() {
     this.x = 5;
     y++;
   }
 
   public A(int i) {
     this();
     y++;
   }
 
   public int f(double d) {
     return 1;
   }
 
   public int f(int i) {
     return 2;
   }
}
```

----------------------------------------------------------------------------------------------------------
Klasse B
----------------------------------------------------------------------------------------------------------

```
public class B extends A {
   public int z = 8;
 
   public B(int x) {
     z = 3;
   }
 
   public int f(double d) {
     return 3;
   }
 
   public int f(float f) {
     return 4;
   } 
}
```

----------------------------------------------------------------------------------------------------------
Was rauskommen sollte:
----------------------------------------------------------------------------------------------------------
[ 5 ]
[ 1 ]
[ 3 ] [ 3 ]
[ 2 ]
[ 3 ]

----------------------------------------------------------------------------------------------------------
Problemstellung:
----------------------------------------------------------------------------------------------------------
Wie die 5 am Anfang rauskommt habe ich durch langes überlegen verstanden. Wenn ich falsch liegen sollte korrigiert mich bitte. Bei dem ersten wert wird ja ein Objekt von A erzeugt und die variable a deklariert. A wird dabeid er Parameter 6 gegeben, was in Klasse A als int i "aufgefangen" wird und durch this(); wird ja der Konstruktor Public A() aufgerufen wo durch this.x der Wert 5 übergeben wird. Und anschließend sowohl bei Publich A() als auch Public A( int i) der Wert y auf 2 erhöht.

Der zweite Wert ist eine Methode wo 1.2f als float ebenfalls bei A abgefangen und durch return der Wert 1 zurück gegeben wird. Die Frage die sich bei mir stellt, warum spruckt Eclipse einen fehler aus wenn ich statt double float in die Klammer schreibe.

Beim dritten verstehe ich zwar wie b.z gleich 3 ist aber wieso ist b.y auch gleich 3? Das kann ich riegdnwie gar nicht nachvollziehen. Meine Vermutung war, dass durch die erste Zeile also von a, dass y den wert 2 behalten hat und nachher die Unterklasse B von A die Eigenschaften erbt und das dort halt der wert von wie in A übergeben wird, aber dann müsste y = 4 sein? Ich blick nicht durch...

Die 4. Zeile kann ich ebenfalls nachvollziehen.

Die 5. Zeile wiederum  verstehe ich nicht ganz. Ich habe in meinem Parameter einen float wieso wird dieser in B einem double übergeben, dass leuchtet mir nicht richtig ein, gibt es dafür eine besondere Regel?

Mit Zeile meine ich übriegens die Out Abschnitte in der Main-Methode.

Und Allgemein hätte ich eine Frage, wie entscheidet sich mein programm bei mehrere Kontruktoren innerhalb der Ober und Unterklasse. Wenn ich z.b. sowohl in B als auch in A einen Konstruktor habe mit selben Parametern, wie entscheidet sich dann mein Programm?

Ich entschuldige mich, falls ich mich schlecht ausgedrückt habe bzw. zu viele Rechtschreibfehler gemacht und falls ich im falschen Forum bzw. Bereich bin.

Würde mich über ne Hilfe sehr freuen. 

~ lg Burak


----------



## VfL_Freak (5. Jan 2016)

Moin,



> Und Allgemein hätte ich eine Frage, wie entscheidet sich mein programm bei mehrere Kontruktoren innerhalb der Ober und Unterklasse. Wenn ich z.b. sowohl in B als auch in A einen Konstruktor habe mit selben Parametern, wie entscheidet sich dann mein Programm?


was heißt "entscheidet" ??
Es kann nur einen gültigen aufzurufenden Konstruktor geben, der dann halt genommen wird!
_*new A(...)*_ ruft den Konstruktor der Klasse *A* auf
_*new B(...)*_ ruft den Konstruktor der Klasse *B* auf
Der jeweilige Parameter (entweder sein _Datentyp _oder aber ggf. auch die _Anzahl_) entscheidet dann weiter!

Gruß Klaus


----------



## Saheeda (7. Jan 2016)

> Und Allgemein hätte ich eine Frage, wie entscheidet sich mein programm bei mehrere Kontruktoren innerhalb der Ober und Unterklasse. Wenn ich z.b. sowohl in B als auch in A einen Konstruktor habe mit selben Parametern, wie entscheidet sich dann mein Programm?



Schau dir mal statische und dynamische Typen an:
https://bruck.me/2014/01/08/java-statischer-vs-dynamischer-typ/


----------



## Burak (12. Jan 2016)

Danke für die Antworten. 

Was ich zusätzlich noch fragen wollte, kennt ihr bzw. könnt mir Seiten/Bücher etc. empfelen bzw. verlinken wo ich Java Aufgaben finde, die mit der schwierigkeitsgrad immer ansteigen. Sie sollten nicht zu simpel, aber auch nicht zu krass sein, am besten etwas was auch die Vorlesung abdeckt. Hauptsächlich bzw. grundsätzlich lernen wir objekt orientiertes Programmieren (was sicher alle machen. ). Wäre super, wenn ihr mir das aushelfen könntet in 4-5 Wochen ist schon die Klausur die Grundlagen sitzen, nur fehlt mir manchmal einfach das "umsetzen" und da brauche ich Übung, die Frage ist was? Wäre super wenn ihr mir etwas verlinken bzw. epfelen könntet, am besten etwas wo auch die Lösungen dabei sind mit Erklärung wäre natürlich auch super. (Bitte kein BlueJ, dass ist schon sehr zeitaufwendig, sich durch das ganze Buch durchzuarbeiten.^^


----------



## Saheeda (12. Jan 2016)

Project Euler ist ne gute Anlaufstelle.


----------



## Burak (14. Jan 2016)

Gibt es vielleicht nichts deutsches? Bzw. was ist das für eine eigenartige Seite... Ich brauche Aufgabentypen. Ich will echt nicht drängen oder nervig wirken, ich bitte ledeglich um Hilfe.^^


----------



## Joose (14. Jan 2016)

Project Euler ist eine gute Seite ebenso guten Aufgaben  diese gehen aber eher in die Richtung: Algorithmen und Mathematik als in Datenverwaltung oder so.

Hier ein Thread (ist zwar aus einem C# Forum aber um die Ideen gehts 
http://www.mycsharp.de/wbb2/thread.php?threadid=44399


----------



## kneitzel (14. Jan 2016)

Das ist übrigens auch der richtige Ansatz: Selbst etwas entwickeln. Kleine Aufgaben suchen und die dann einfach umsetzen. Fremden Code zu analysieren mag eine Kontrolle des Verständnisses sein, aber zum lernen muss man wirklich selbst Hand anlegen und etwas schreiben. Und dann mit dem Debugger Probleme lösen. So kommt auch der Verständnis vom Code automatisch.

Konrad


----------



## Burak (14. Jan 2016)

Das stimmt sicherlich, dass streite ich nicht ab. Derzeit habe ich probleme Java zu erlenern, gerade weil mir einfach Aufgaben fehlen, wo ich mich reinarveiten kann, oder davon abgeschreckt zu werden. Die Programmanalyse ist nur immer die erste Aufgabe in der Klausur, sie fragt halt Dinge wie Konstruktor, Methoden, Objekte sowie Vererbungstechnische Grundlagen ab. Meistens sind sie ziemlich gemein gestellt.

Die theorie sitzt bei mir ja auch eigentlich, nur die Umsetzung fehlt. Bis zur Klausur (vorrausgesetzt ich werd zugelassen) sind es noch 6 Wochen, ich hoffe bis dahin kann ich es.

Bzw. danke für den Link, wenn ihr mehr habt, gerne her damit.


----------



## Saheeda (14. Jan 2016)

@Burak 
Das Gefühl dafür, welche Methoden/Konstruktoren man brauchen könnte und wie eine sinnvolle Vererbungshierarchie aussehen könnte, bekommt man aber nicht durch Lesen sondern, wie @kneitzel schon sagte, durch selbst Programmieren.
OOP in der Theorie herunterbeten zu können ist noch lange kein Garant dafür, sinnvollen und lesbaren Code zu produzieren.


----------



## kneitzel (14. Jan 2016)

Also was ich damals gemacht habe (aber ohne ein 6 Wochen Limit) war, einfach alles, was mir vor die Füße gefallen ist, am Computer zu implementieren. Egal was es war - Vokabeln lernen in Englisch, Dreiecke berechnen und zeichnen, .... Ist aber schon sehr lange her 

In nur 6 Wochen wird es etwas schwieriger. Aber man kann sich ja einfach einmal anschauen, um was für Themen es geht um dann dafür eine Implementation zu erstellen. Da kannst Du ja irgendwas nehmen, was Dir gerade einfällt. Von mir aus einen Teil deiner Uni. Da sind dann Menschen, Studenten, Angestellte, Professoren, ... Kurse, Räume, ...
Du musst halt nur einmal schauen, was es da so alles gibt. Und dann hast Du genug mit Konstruktoren und überladen kannst Du dann auch ohne Ende, indem Du z.B. Kurs.add(...) hast, um z.B. Studenten, Lehrkörper, Räume, Zeiten, ... hinzuzufügen.
Damit hast Du dann auch das Überladen, mit dem Du etwas spielen kannst.

Versuch dabei erst einmal unnötige Technologien zu vermeiden. Also wenn Ihr nichts mit GUIs gemacht habt, dann bleibt das außen vor. Laden/Speichern von Werten oder Eingaben abfragen kommt halt auch nur, wenn Ihr sowas im Kurs hattet und das für die Klausur relevant ist. (Mag Ausnahmen geben, aber verzettel Dich nicht!)

Das wäre so eine Möglichkeit.

Oder spiel mit Beispielen aus dem Kurs weiter. Was kann man noch erweitern? Was könnte man verbessern? Beispiele vom Anfang des Kurses neu schreiben unter Nutzung von Möglichkeiten, die erst später gekommen sind.

Konrad


----------

