Learning By Doing Konstruktoren • Gleicher Name wie die Klasse • Kein Rückgabewert, daher kein Rückgabetyp • Wir immer bei der Objekterzeugung mit new automatisch ausgeführt • Zur Initialisierung des Objekts, insbesondere mit Parametern • Ohne Parameter: Standardkonstruktor (default constructor) • Kann entfallen (es wird ein vordefinierter Standardkonstruktor verwendet) • Wird oft überladen, um verschiedene Initialisierungen (mit mehr oder weniger vielen Standardwerten) zu ermöglichen • Kann nicht wie ein gewöhnliche Methode aufgerufen werden • Überladene Konstruktoren können mit this(...) am Anfang des Konstruktors verwendet werden • Konstruktoren der Superklasse (Basisklasse) können mit super(...) am Anfang des Konstruktors verwendet werden. Fehlt dieser Aufruf, so wird automatisch der Standardkonstruktor der Basisklasse verwendet Learning By Doing Musterbeispiel für Konstruktoren // Stern.java import java.awt.geom.*; import java.awt.*; import ch.aplu.util.*; public class Stern { private GPanel p; // 2 gleichseitige Dreiecke mit Mitte in mx, my private GeneralPath gp1, gp2; private int r; // Umkreisradius private int mx, my; // Mitte private Color color; // Farbe public Stern(GPanel p, int r, Color color) { this.p = p; this.r = r; this.color = color; mx = 0; // Mitte in (0, 0) my = 0; gp1 = new GeneralPath(); gp1.moveTo(r, 0); gp1.lineTo((int)( -0.5 * r), (int)(0.866 * r)); gp1.lineTo((int)( -0.5 * r), (int)( -0.866 * r)); gp1.closePath(); gp2 = new GeneralPath(); gp2.moveTo( -r, 0); gp2.lineTo((int)(0.5 * r), (int)(0.866 * r)); gp2.lineTo((int)(0.5 * r), (int)( -0.866 * r)); gp2.closePath(); } h s 3 *r y 3 *r 2 0.866r r/2 r x Learning By Doing public void rotate(double angle) { AffineTransform at = new AffineTransform(); at.rotate(angle, mx, my); gp1.transform(at); gp2.transform(at); } public void moveAt(int mx, int my) { AffineTransform at = new AffineTransform(); at.translate(mx - this.mx, my - this.my); gp1.transform(at); gp2.transform(at); this.mx = mx; this.my = my; } public void showMe() { p.color(color); p.fillGeneralPath(gp1); p.fillGeneralPath(gp2); } public static void main(String[] args) { GPanel p = new GPanel(0, 500, 0, 500); Stern s = new Stern(p, 50, Color.red); s.moveAt(250, 250); s.showMe(); } } Animation ohne Flackern (Doppelbufferung) public static void main(String[] args) { GPanel p = new GPanel(0, 500, 0, 500); Stern s = new Stern(p, 50, Color.red); s.moveAt(250, 250); p.enableRepaint(false); while (true) { s.rotate(1); s.showMe(); p.repaint(); Console.delay(100); p.clear(); } }