Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Aufgabe: Erstellen Sie die Klasse Punkt, (mit den entsprechenden Attributen und Methoden), die einen Punkt (Pixel) in einer grafischen zweidimensionalen.

Ähnliche Präsentationen


Präsentation zum Thema: "Aufgabe: Erstellen Sie die Klasse Punkt, (mit den entsprechenden Attributen und Methoden), die einen Punkt (Pixel) in einer grafischen zweidimensionalen."—  Präsentation transkript:

1 Aufgabe: Erstellen Sie die Klasse Punkt, (mit den entsprechenden Attributen und Methoden), die einen Punkt (Pixel) in einer grafischen zweidimensionalen Oberfläche repräsentieren soll. Erzeugen Sie auch ein paar konkrete Punkte.

2 Um anzudeuten, dass es sich um Pixel handelt, wird im Folgenden den x- und y-Koordianten eines Punktes der Datentyp integer gegeben. Man könnte aber genauso den Datentyp double verwenden.

3 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } // Klasse Punkt kommt gleich...

4 class Punkt{ private int x; private int y; public Punkt(){ x=0; y=0; } public Punkt(int px, int py){ setPunkt(px,py); } public void setPunkt(int px, int py){ x=px; y=py; } Name der Klasse privater Bereich: Auf die Member des privaten Bereichs kann außerhalb der Klasse nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden. öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

5 public void setX(int px){ x=px; } public void setY(int py){ y=py; } public int getX(){ return(x); } public int getY(){ return(y); }

6 Wir gehen die Anweisungen von main Schritt für Schritt durch...

7 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); }

8 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky

9 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? Nebenbei: Was passiert, wenn der Standardkonstruktor nicht existiert? Der Compiler legt keinen an, da schon ein Konstruktor (mit 2 Parametern existiert) --> Fehlermeldung

10 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00??

11 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35??

12 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? Fehlermeldung: x ist private (ein privater Bereich)

13 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35??

14 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? 79??

15 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? 79??

16 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? 79?? 797?

17 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? 79?? 797?

18 public class MainKlassen5{ public static void main(String[] args) throws Exception{ int kx,ky; Punkt p; p=new Punkt(); p.setPunkt(3,5); p.x=12; p.setPunkt(7,9); kx=p.getX(); ky=p.getY(); } p.xp.xp.yp.ykxky 00?? 35?? 79?? 797? 7979

19 Nochmals zu den Zugriffsrechten (erklärt an Ausschnitten des letzten Programms).

20 Abkürzungen: ZvA: Zugriff von außerhalb einer Klasse ZvI: Zugriff von innerhalb eines Klasse

21 Zugriff innerhalb einer Klasse bedeutet den Zugriff auf ein Member von innerhalb einer Methode der Klasse. Beispiel: public void setPunkt(int px, int py){ x = px; y = py; } Zugriff auf die Member x und y

22 Zugriff außerhalb einer Klasse bedeutet den Zugriff (von einer anderen Klasse) auf ein Member einer anderen Klasse mit Hilfe des Punkts. Beispiel: public static void main(...){ Punkt p = new Punkt(2,8); p.setPunkt(5,13); } Von einer anderen Klasse (z.B. der Startklasse) wird auf das Member setPunkt(...) der anderen Klasse Punkt zugegriffen.

23 ... anderen Klasse (bzw. außerhalb) außerhalb fängt mit einem a an, also jetzt wird das a ausgefüllt... Wie kann man sich merken, dass außerhalb mit einem Punkt zusammenhängt?... und der Balken entfernt, dann hat man einen...

24 ... Punkt.

25 // main(...){ p.x=12; p.setPunkt(7,9); } class Punkt{ private int x; private int y; public Punkt(int px, int py){ setPunkt(px,py); } public void setPunkt(int px, int py){ x=px; y=py; } privater Bereich: Auf die Member des privaten Bereichs kann außerhalb der Klasse nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden. öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

26 // main(...){ p.x=12; p.setPunkt(7,9); } class Punkt{ private int x; private int y; public Punkt(int px, int py){ setPunkt(px,py); } public void setPunkt(int px, int py){ x=px; y=py; } ZvA auf private Member x: verboten ZvA auf public Member setPunkt: erlaubt ZvI auf private Member y: erlaubt ZvI auf private Member x: erlaubt ZvI auf public Member setPunkt: erlaubt Begründen Sie, ob die rot markierten Zugriffe auf Member der Klasse erlaubt sind oder nicht.

27 Eine Klasse kann durch die sogenannte UML (Unified Modeling Language) beschrieben werden.

28 UML ist eine formale Sprache zur objektorientierten Spezifikation, Visualisierung, Konstruktion und Dokumentation von Softwaresystemen und Geschäftsmodellen.

29 Mit UML kann man z.B.die Klasse Punkt wie folgt durch ein sogenanntes Klassendiagramm darstellen:

30 Punkt - x: int - y: int + Punkt() + Punkt(px:int, py:int) + setPunkt(px:int, py:int): void + getX (): int + getY (): int - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public Attribute Methoden

31 Warum soll man folgende Aussage befolgen ?Nur Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ändern der Attribute)

32 Warum macht man diesen Umweg über die Methoden ? Warum greift man nicht direkt auf die Attribute zu ?

33 Schauen wir uns dazu ein paar Beispiele aus der täglichen Praxis an...

34 Warum benutzen wir an der Kasse im Supermarkt als Werkzeug den Kassierer, um auf die Kasse zuzugreifen ? Warum machen wir das nicht direkt (ohne den Kassierer) ?

35 Weil man dann den Kassenstand auf einen unerwünschten Wert verändern und einen ungewollten Ortswechsel der Kasse veranlassen kann!

36 Warum benutzen wir am Bankschalter als Werkzeug die EC-Karte, um auf die Kasse der Bank zuzugreifen ? Warum machen wir das nicht direkt (ohne Banker oder ohne EC-Karte) ?

37 Weil man dann den Kassenstand auf einen unerwünschten Wert verändern kann !

38 Warum wird in einigen Autos als Werkzeug das ABS-System benutzt ? Warum bremst man nicht direkt mechanisch (ohne Elektronik) ?

39 Weil man dann die Bremskraft auf einen unerwünschten Wert verändern kann (Bremsen blockieren)!

40 Warum wird in einigen Häusern als Werkzeug ein Thermostat verwendet, um die Temperatur zu regeln ? Warum macht man dies nicht direkt (einfüllen von Heizöl in den Ölofen) ?

41 Weil man dann z.B. in kürzester Zeit zu viel Heizöl in den Ofen leeren kann und es dann zu nicht gewünschten Verbrennungseffekten (Ofen explodiert !) kommen kann.

42 Weitere Beispiele:

43 Im Airbus, dem vollelektronischen Flugzeug, greift der Pilot nur über die Elektronik auf das Höhenruder, usw. zu

44 Die Opferbüchse in der Kirche besitzt eine Vorrichtung, die den Geldfluß nur in eine Richtung zuläßt.

45 Der Zugriff über die Boxhandschuhe auf den Körper des Gegners schützt diesen zumindest in einem gewissen Maße.

46 Die Verheiratung von Ehepartnern geschieht durch eine untere Verwaltungsbehörde. Dadurch sollen unerwünschte Vermählungen der handelnden Subjekte (enge Verwandtschaft, Artenschrankenüberschreitung) verhindert werden.

47 Diese Werkzeuge (Kassierer, EC-Karte, ABS-System, usw.) werden so gebastelt, daß sie es nicht erlauben, bestimmte Systemparameter (Geldmenge in Kasse, usw.) auf unerwünschte Werte abzuändern.

48 In Java sind diese Werkzeuge Methoden, die es dem Klassen-Programmierer (= Programmierer, der Klassen verwendet) nicht erlauben, die Attribute auf unerwünschte Werte abzuändern.

49 Wenn eine Methode dies garantiert, nennt man dies auch Zusicherung (englisch: constraint)

50 Mit welcher Anweisung in Java kann man in einer Methode verhindern, dass ein Attribut auf einen unerwünschten Wert gesetzt wird ? Mit der if - Anweisung!

51 Aufgabe: Basteln Sie die Klasse Konto mit den zugehörigen Attributen und Methoden. Implementieren Sie speziell die Methode abheben. Diese soll garantieren, dass beim Abheben der Kontostand nicht unter 5000 Euro Schulden fallen kann.

52 class Konto{ private double stand; public void setKonto(double pStand){ stand = pStand; } public void abheben(double geld){ if(stand-geld >= -5000){ stand = stand - geld; } }; // class Konto Name der Klasse privater Bereich: Auf die Member des privaten Bereichs kann außerhalb der Klasse nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden. öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

53 class Konto{ private double stand; public void setKonto(double pStand){ stand = pStand; } public void abheben(double geld){ if(stand-geld >= -5000){ stand = stand - geld; } }; // class Konto Wenn das Abheben nicht geklappt hat (weil versucht wurde zu viel Geld abzuheben), gibt diese Methode kein "feedback". Wie könnte man dies andern? Schreiben Sie dazu eine entsprechende Methode. public boolean abheben(double geld){ boolean erg=false; if(stand-geld >= -5000){ stand = stand - geld; erg=true; } return erg; }

54 class Konto{ private double stand; public void setKonto(double pStand){ stand = pStand; } public void abheben(double geld){ if(stand-geld >= -5000){ stand = stand - geld; } }; // class Konto... main(){ Konto k=new Konto(); k.setKonto(1000); k.abheben(7000); } k.stand : 0 Da kein Konstruktor programmiert wurde, wird automatisch (ohne Zutun des Programmierers) vom Compiler der Standard-Konstruktor angelegt. Dieser enthält - außer super() - keine Anweisungen. Beim Anlegen eines Objekts werden alle Attribute auf 0 gesetzt. Deswegen bekommt das Attribut stand den Wert 0.

55 class Konto{ private double stand; public void setKonto(double pStand){ stand = pStand; } public void abheben(double geld){ if(stand-geld >= -5000){ stand = stand - geld; } }; // class Konto... main(){ Konto k=new Konto(); k.setKonto(1000); k.abheben(7000); } k.stand : 1000

56 class Konto{ private double stand; public void setKonto(double pStand){ stand = pStand; } public void abheben(double geld){ if(stand-geld >= -5000){ stand = stand - geld; } }; // class Konto... main(){ Konto k=new Konto(); k.setKonto(1000); k.abheben(7000); } k.stand : 1000 Zusicherung: Kontostand > -5000

57 In UML

58 Konto - stand: double + setKonto(pStand:double):void + abheben(geld:double): void - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public { stand >= } Zusicherung

59 Aufgabe: Basteln Sie in der Klasse Konto die Methode int vergleiche(...) Diese soll 2 Konten bzgl. des Kontostands vergleichen. Welchen Wert soll diese Methode zurückgeben?

60 -1 : Kontostand des 1. Kontos Kontostand des 2. Kontos

61 Wie viele Parameter benötigt die Methode int vergleiche(...)

62 Annahme: Die Methode benötigt zwei Parameter. Aufgabe: Implementieren Sie diese Methode!

63 class Konto{ private double kontostand; private double zinssatz; public Konto(double pKontostand, double pZinssatz){ kontostand = pKontostand; zinssatz = pZinssatz; } public double getKontostand() { return kontostand; } public double getZinssatz() { return zinssatz; }

64 public void setKontostand(double pKontostand){ kontostand = pKontostand; } public void setZinssatz(double pZinssatz) { zinssatz = pZinssatz; }

65 public int vergleiche(Konto k1, Konto k2){ int erg; if(k1.kontostand < k2.kontostand){ erg=-1; } else if(k1.kontostand == k2.kontostand){ erg=0; } else{ erg=1; } return erg; } Halt, halt: Warum gibt es keine Fehlermeldung bei k1.kontostand bzw. k2.kontostand ? Es wird doch auf ein private Member zugegriffen!

66 public int vergleiche(Konto k1, Konto k2){ int erg; if(k1.kontostand < k2.kontostand){ erg=-1; } else if(k1.kontostand == k2.kontostand){ erg=0; } else{ erg=1; } return erg; } Weil nicht von einer anderen Klasse auf kontostand zugefriffen wird. Innerhalb der gleichen Klasse Konto wird auf kontostand der gleichen Klasse Konto zugegriffen!

67 Vergleichen Sie in main() zwei Konten miteinander (bzgl. des Kontostands), indem Sie die Methode vergleiche(...) aufrufen.

68 public class MainKonto1 { public static void main(String[] args){ int x; } Konto ko1 = new Konto(100,1); Konto ko2 = new Konto(200,1); Konto ko3 = new Konto(300,3); x=ko3.vergleiche(ko1, ko2); System.out.println("x="+x); Wie kann man jetzt diese zwei Konten vergleichen? Vielleicht durch vergleiche(ko1,ko2); ? Nein, da die Methode vergleiche nur durch ein Objekt der Klasse Konto aufgerufen werden kann. D.h. wir brauchen ein Konto Wie werden die Konten nun verglichen?

69 public class MainKonto1 { public static void main(String[] args){ int x; } Konto ko1 = new Konto(100,1); Konto ko2 = new Konto(200,1); Konto ko3 = new Konto(300,3); x=ko3.vergleiche(ko1, ko2); System.out.println("x="+x); Welchen Sinn hat das 3. Konto? Es wird nur gebraucht, um die Methode vergleiche mit den Parametern ko1 und ko2 aufzurufen. Die Werte der Attribute von ko3 werden nicht verwendet. Sie sind völlig unwichtig!!

70 public class MainKonto1 { public static void main(String[] args){ int x; } Konto ko1 = new Konto(100,1); Konto ko2 = new Konto(200,1); x=ko2.vergleiche(ko1, ko2); System.out.println("x="+x); Gibt es eine Alternative, die das 3. Konto ko3 nicht verwendet? Man könnte genaus so gut auch ko1 nehmen: x=ko1.vergleiche(ko1, ko2);

71 Es werden also auch 3 Konten verwendet, wobei das Konto, das beim Aufruf verwendet wird (also ko2) nochmals als 2. Parameter beim Aufruf verwendet wird. Es werden also 3 Konten verwendet, wobei 2 davon identisch sind.

72 Wir wollen deshalb die Methode vergleiche erstellen, die genau 2 Konten verwendet, wobei der Parameter nur ein Konto hat und trotzdem 2 Konten vergleichen kann. Wo steckt dabei das 2. Konto?

73 Das 2. Konto steckt im Aufruf: ko1.vergleiche(ko2) Wie kann man aber innerhalb eines Objekts auf das Objekt selbst (= das aufrufende Objekt) zugreifen ? Um innerhalb eines Objekts auf das Objekt selbst (= das aufrufende Objekt) zugreifen zu können, wird in Java der Name this verwendet.

74 Das 2. Konto steckt im Aufruf: ko1.vergleiche(ko2) Implementieren Sie die zugehörige Methode vergleiche(...)

75 public int vergleiche(Konto pKo){ int erg; if(this.kontostand < pKo.kontostand) erg=-1; else if(this.kontostand == pKo.kontostand) erg=0; else erg=1; return erg; } Um trotzdem innerhalb eines Objekts auf das Objekt selbst zugreifen zu können, wird in Java beim Zugriff auf das Objekt selbst der Name this verwendet. Andere Möglichkeit: Man läßt this weg: if(kontostand < pKo.kontostand) Dann ist das Attribut kontostand auch das Attribut des Objekts selbst (aktuelle Objekt). Warum benutzt man dann this überhaupt? Siehe nachher später.

76 Vergleichen Sie in main() zwei Konten miteinander (bzgl. des Kontostands), indem Sie die Methode vergleiche(mit nur einem Parameter) aufrufen.

77 public class MainKonto1 { public static void main(String[] args){ int x; } Konto ko1 = new Konto(100,1); Konto ko2 = new Konto(200,1); x=ko1.vergleiche(ko2); System.out.println("x="+x); Wie kann man jetzt diese zwei Konten vergleichen? Gibt es noch eine andere Möglichkeit für einen Aufruf? x=ko2.vergleiche(ko1);

78 Aufgabe: Basteln Sie in der Klasse Konto die Methode Konto vergleiche(...) Diese soll 2 Konten bzgl. des Kontostands vergleichen und das zurückgeben, das den höheren Kontostand hat.

79 public Konto vergleichen(Konto pKo){ Konto temp; if(this.kontostand < pKo.kontostand){ //if(kontostand < pKo.kontostand){ temp=pKo; } else{ temp=this; } return temp; } Hier kann man jetzt this nicht mehr weglassen! Es ist die einzige Möglichkeit auf das Objekt selbst (= das aufrufende Objekt) zuzugreifen! Dieses this kann zwar weggelassen werden (siehe ein paar Folien früher), … aber Warum kann man diese Methode nicht (wie int vergleiche(Konto pKo){…} ) auch vergleiche(…) nennen ?

80 public Konto vergleichen(Konto pKo){ Konto temp; if(this.kontostand < pKo.kontostand){ //if(kontostand < pKo.kontostand){ temp=pKo; } else{ temp=this; } return temp; } Weil die folgenden Methoden int vergleiche(Konto pKo){ …} Konto vergleiche(Konto pKo){ …} die gleichen Signaturen haben. Die Signaturen für unterschiedliche Methoden müssen aber verschieden sein. MERKE: Die Signatur einer Methode ist gekennzeichnet durch die Anzahl und/oder den jeweiligen Datentyp der Parameter der Methode. Der Rückgabetyp der Methode gehört nicht zur Signatur.

81 Die Signatur einer Methode ist gekennzeichnet durch die Anzahl und/oder den jeweiligen Datentyp der Parameter der Methode. Der Rückgabetyp der Methode gehört nicht zur Signatur.

82 int vergleiche(Konto pKo){ Die Signatur einer Methode ist gekennzeichnet durch die Anzahl und/oder den jeweiligen Datentyp der Parameter der Methode. Der Rückgabetyp der Methode gehört nicht zur Signatur.

83 Vergleichen Sie in main() zwei Konten miteinander (bzgl. des Kontostands), indem Sie die Methode vergleichen(mit nur einem Parameter) aufrufen.

84 public class MainKonto1 { public static void main(String[] args){ Konto temp; } Konto ko1 = new Konto(100,1); Konto ko2 = new Konto(200,1); temp=ko1.vergleichen(ko2); System.out.println( " Max="+temp. getKontostand()); Wie kann man jetzt diese zwei Konten vergleichen?

85 Aufgabe (siehe Klasse Punkt) Basteln Sie zusätzlich zur Klasse Punkt noch die Klasse Gerade, die durch zwei Punkte gegeben ist.


Herunterladen ppt "Aufgabe: Erstellen Sie die Klasse Punkt, (mit den entsprechenden Attributen und Methoden), die einen Punkt (Pixel) in einer grafischen zweidimensionalen."

Ähnliche Präsentationen


Google-Anzeigen