Benutzer-Werkzeuge

Webseiten-Werkzeuge


techniken:objektorientjava2

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
techniken:objektorientjava2 [2016/07/13 17:18]
c.jaedicke [Welche Zugriffsmodifizierer solltest du verwenden?]
techniken:objektorientjava2 [2016/07/21 15:02] (aktuell)
c.jaedicke [Exception Handling]
Zeile 2: Zeile 2:
  
  
-===== Konventionen ===== 
- 
- 
-Bei der Benennung von Methoden sollte man sich an zwei grundsätzliche Konventionen halten: ​ 
-  - Der Name der Methode fängt mit einem kleinen Buchstaben an und Namen welche mehrere Worte beinhalten fangen beim zweiten Wort mit einem Großbuchstaben an.  
-  - Der Name sollte beschreiben wie die Methode mit dem Objekt interagiert. 
- 
-Unsere Klasse bekommt zwei weitere Methoden, eine um den Roboter an seiner aktuellen Position zu zeichnen und eine um den Roboter um einen gewissen Winkel zu drehen. 
- 
-<code java> 
-class Robot { // Deklaration der Klasse Robot 
- 
-  int dRobot = 50;    //Der Durchmesser des Roboters in Pixel 
-  float direction = PI;  //Die Richtung in die der Roboter schaut ​ 
-                      //(PI (links), da der Winkel in Bogenmaß angegeben wird) 
-  float posX = 100;   //Die x-Position des Roboters in Pixel 
-  float posY = 100;   //Die y-Position des Roboters in Pixel 
-  ​ 
-  //Diese Methode zeichnet einen Roboter ​ 
-  //an seiner aktuellen Position und Ausrichtung. 
-  void drawRobot(){ //"​void"​ bedeutet dass es keinen Rückgabewert gibt 
-    // Zeichne einen Kreis an der Position des Roboters. 
-    ellipse(posX,​posY,​dRobot,​dRobot);​ 
-    // Zeichne eine Linie welche die Orientierung des Roboters angibt. 
-    line(posX,​posY,​posX+cos(direction)*50,​ posY+sin(direction)*50);​ 
-  } 
-  ​ 
-  //Die moveForward-Funktion verändert die Position so, wie es einen Schritt nach vorne entspricht. 
-  void moveForward(float distance){ 
-    posX = posX+cos(direction)*distance;​ // Innerhalb der Funktion kann direkt auf die Klassenvariablen ​ 
-    posY = posY+sin(direction)*distance;​ // zugegriffen werden. (Sie sind im Objekt quasi "​lokal"​) 
-  } 
-  ​ 
-  //Diese Methode dreht den Roboter um einen gewissen Winkel ​ 
-  //welcher von "​winkelaenderung"​ vorgegeben wird. 
-  // Die Methode bekommt einen Übergabeparameter vom Typ "​float"​. 
-  void turnRobot(float angle){ ​ 
-    this. direction += angle; 
-  } 
-  ​ 
-} 
- 
-</​code>​ 
- 
-===== Tabs  in Processing ===== 
-Jetzt können wir die fertige Klasse verwenden. Um dies in Processing auf eine möglichst übersichtliche weise zu tun sollte ein neuer Tab geöffnet werden: 
- 
-{{:​Techniken:​processingtab.jpg?​nolink|}} 
- 
-In diesem neuen Tab speichert ihr eure Klasse. 
-===== Klasse verwenden in Processing ===== 
- 
-Ein Programm welches in Processing geschrieben wurde kann die "​Robot"​-Klasse z.B. folgendermaßen einsetzen: 
- 
-<code java> 
- 
-//Erstellt ein global verfügbares Objekt vom Typ "​Robot", ​ 
-//wie "​int"​ oder "​double",​ und geben ihm den Namen "​myRobot"​. 
-Robot myRobot; 
- 
-void setup() { 
-  // Festlegen der Fenstergröße 
-  size(500,​500);​ 
-  // Festlegen der Hintergrundfarbe 
-  background(235);​ 
-  //​Initialisiert das "​Robot"​ Objekt 
-  myRobot = new Robot(); 
-} 
- 
-void draw() { 
-  //Zu beginn jeder draw-Iteration wird das Fenster zurückgesetzt. 
-  background(235);​ 
-  //Das Robot-Objekt verfügt über eine Funktion die den Roboter malt. 
-  myRobot.drawRobot();​ 
-  //Diese Funktion bewegt den Roboter ein wenig. 
-  myRobot.moveRobot();​ 
-  //Dieser Funktionsaufruf sorgt dafür das der Roboter nach jeder translation ​ 
-  //um PI/200 gedreht wird. 
-  myRobot.turnRobot(PI/​200);​ 
-} 
- 
-</​code>​ 
  
 ===== Klassen für Fortgeschrittene ===== ===== Klassen für Fortgeschrittene =====
Zeile 151: Zeile 69:
 } }
 </​code>​ </​code>​
-===== Referenzvariablen ===== 
  
-Variablen welche stellvertretend für ein Objekt verwendet werden, z.B. myRobot aus dem vorherigen Bsp., stellen lediglich eine Referenz auf das Objekt dar. Man kann die Variable also auch als die Speicheradresse des Objektes verstehen. Dieser Sachverhalt ist insbesondere dann von Bedeutung wenn ein Objekt kopiert werden soll. Die "​best-practise"​ ist das Anlegen eines "​copy"​-Konstruktors in jeder Klasse, dieser überträgt alle Attribute des zu kopierenden Objektes in ein neues Objekt: 
- 
-<code java> 
- 
-class DummyBean { 
-  String dummy; 
-  int yummyDummy; 
- 
-  DummyBean(DummyBean dummyBeanToCopy) { 
-    this.dummy = dummyBeanToCopy.dummy;​ 
-    this.yummyDummy = dummyBeanToCopy.yummyDummy;​ 
-  } 
-} 
- 
-</​code>​ 
- 
-Und können diesen Konstruktor entsprechend aufrufen: 
- 
-<code java> 
-//A Object of my DummyBean class 
-DummyBean myFirstDummy = new DummyBean();​ 
-//make a copy of the myFirstDummy object 
-DummyBean mySecondDummy = new DummyBean(myFirstDummy);​ 
-</​code>​ 
- 
-Kopiert man Objekte nicht auf diese Weise sondern durch: 
- 
-<code java> 
-//A Object of my DummyBean class 
-DummyBean myFirstDummy = new DummyBean();​ 
-//silly copy 
-DummyBean mySecondDummy = myFirstDummy;​ 
-</​code>​ 
-, dann wirken sich Änderungen an "​myFirstDummy"​ auch auf "​mySecondDummy"​ aus da beide Variablen auf das selbe Objekt verweisen. 
 ===== Zugriffssteuerung auf Memberfunktionen und Variablen ===== ===== Zugriffssteuerung auf Memberfunktionen und Variablen =====
 Im Paradigma des Objektorientierten Programmierens werden Zugriffsmodifizierer verwendet um die Rechte anderer Objekte einzuschränken ([[https://​de.wikipedia.org/​wiki/​Datenkapselung_(Programmierung)|Datenkapselung]]). Unter Java werden folgende Zugriffsmodifizierer verwendet: Im Paradigma des Objektorientierten Programmierens werden Zugriffsmodifizierer verwendet um die Rechte anderer Objekte einzuschränken ([[https://​de.wikipedia.org/​wiki/​Datenkapselung_(Programmierung)|Datenkapselung]]). Unter Java werden folgende Zugriffsmodifizierer verwendet:
Zeile 237: Zeile 120:
  
 Eine ausführliche Beschreibung wie Vererbung funktioniert findet ihr hier: [[http://​www.java-tutorial.org/​vererbung.html|http://​www.java-tutorial.org/​vererbung.html]] Eine ausführliche Beschreibung wie Vererbung funktioniert findet ihr hier: [[http://​www.java-tutorial.org/​vererbung.html|http://​www.java-tutorial.org/​vererbung.html]]
 +
 +===== Exception Handling =====
 +In diesem Abschnitt geht es um Fehlerbehandlung von Fehlern die zur Laufzeit eures Programmes auftreten. Das sind alle Fehler die nicht schon beim Kompilieren eures Codes auftreten. Dazu gehören Fehler wie versuchter Zugriff auf bisher nicht erzeugte Objekte oder Division durch Null. \\
 +Im Gegensatz zu anderen Programmiersprachen,​ wie etwa C, muss in Java ein Fehler nicht gleich zum Programmabsturz führen. Solche Fehler werden in Java als //​Exceptions//​ behandelt und können abgefangen werden. Am Beispiel der Roboter-Klasse führen wir eine Null-Pointer-Exception herbei, indem wir das Robot-Objekt nicht initialisieren und trotzdem versuchen die drawRobot-Methode aufzurufen:
 +<code java>
 +Robot myRobot;
 +
 +void setup() {
 +  size(199,​199);​
 +}
 +
 +void draw() {
 +    myRobot.drawRobot();​
 +}
 +</​code>​
 +Dieser Code führt zum Abbruch des Programms und es wird der Hinweis //​NullPointerException//​ ausgegeben. Der Vorteil des sogenannten try-catch-Blocks ist das der Fehler nicht zum Absturz führt und eine detaillierte Fehlerausgabe mit Angabe der fehlerhaften Programmzeile generiert wird.
 +<code java>
 +Robot myRobot;
 +void setup() {
 +  size(199,​199);​
 +}
 +void draw() {
 +  try
 +  {
 +    myRobot.drawRobot();​
 +  }
 +  catch(Exception e)
 +  {
 +    println("​Exception:​ " + e.getMessage());​
 +    e.printStackTrace();​
 +  }
 +}
 +</​code>​
 +Die Ausgabe zeigt euch den Pfad in dem der Fehler aufgetreten ist, wobei die erste Zeile eure Message ist, die zweite der Exception-Typ und die dritte gibt euch am Ende der Zeile die entsprechende Zeile in eurem Code:
 +<​code>​
 +Exception: null
 +java.lang.NullPointerException
 + at sketch_160720a.draw(sketch_160720a.java:​24)
 + at processing.core.PApplet.handleDraw(PApplet.java:​2402)
 + at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:​1527)
 + at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:​316)
 +</​code>​
 +
 +<note important>​Processing fügt eurem Code vor dem Kompilieren noch einige Zeilen Code hinzu, daher verschiebt sich die Zeilenangabe etwas. Die Verschiebung müsst ihr experimentell feststellen!</​note>​
techniken/objektorientjava2.1468423134.txt.gz · Zuletzt geändert: 2016/07/13 17:18 von c.jaedicke