1 / 73

Klassenvariable

Klassenvariable.

bazyli
Download Presentation

Klassenvariable

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Klassenvariable

  2. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt, müsste man für jede Kuh und jede Henne den gleichen Literpreis, bzw. den gleichen Eierpreis festlegen. Schreiben Sie ein passendes Programm dazu. Erzeugen Sie mehrere Kühe und Hennen.

  3. class Henne{ private String name; private double legeLeistung; private double eierPreis; public Henne(String pName, double pLegeLeist, double pEierPreis){ name = pName; legeLeistung = pLegeLeist; eierPreis = pEierPreis; } public void setEierPreis( double pEierPreis){ eierPreis = pEierPreis; } } Dieser Preis gilt für jede Henne

  4. class Kuh{ private String name; private double milchLeistung; private double literPreis; public Kuh(String pName, double pMilchLeis, double pLiterPreis){ name = pName; milchLeistung = pMilchLeist; literPreis = pLiterPreis; } public void setLiterPreis( double pLiterPreis){ literPreis = pLiterPreis; } } Dieser Preis gilt für jede Kuh

  5. public class MainKlassenvar{ public static void main( String[] args){ Kuh k1=new Kuh( "Elsa", 15, 70); Kuh k2=new Kuh( "Frida", 10, 70); Henne h1=new Henne( "Ute", 3, 20); Henne h2=new Henne( "Pute", 5, 20); } } Dieser Preis gilt für jede Kuh Dieser Preis gilt für jede Henne

  6. Da es viel Schreibaufwand macht, für jede Kuh den gleichen Literpreis und für jede Henne den gleichen Eierpreis festzulegen, ist es viel sinnvoller, dies mit einer einzigen Anweisung zu machen.Zuerst wird dazu eine sogenannte Klassenvariable definiert. Eine Klassenvariable unterscheidet sich von einem "normalen" Attribut durch den Vorsatz "static".

  7. In der Klasse Kuh bzw Henne wird deshalb die Klassenvariable "literPreis" bzw. "eierPreis" wie folgt definiert:private static double literPreis;private static double eierPreis;

  8. 1) Mit der "normalen" Methode (Exemplarmethode), die wir bis jetzt kennen gelernt haben. Es gibt zwei Möglichkeiten mit einer Methode auf eine Klassenvariablen zuzugreifen: 2) Mit der sogenannten Klassenmethode, die sich von der "normalen" Methode (Exemplarmethode) durch den Vorsatz static unterscheidet. In der Klasse Kuh wird dies also z.B. wie folgt realisiert:

  9. In der Klasse Kuh wird dies also z.B. wie folgt realisiert: public static void setLiterPreis( double pLiterPreis){ literPreis = pLiterPreis; }

  10. Eigenschaften der Klassenmethoden:1) Klassenmethoden können nur auf Klassenvariablen zugreifen. 2) Klassenmethoden können nur Klassenmethoden der gleichen Klasse aufrufen.Dagegen haben alle Exemplarmethoden Zugriff auf die Klassenvariablen und Klassenmethoden.

  11. Die Methode main(...) ist immer als static deklariert.Was ist deshalb falsch am folgenden Programm?

  12. public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); } public double verdopple( double pWert){ return(2*pWert); } } main(..) ist immer static, also ... ist main(...) eine Klassenmethode Da eine Klassenmethode nur auf Klassenmethoden der gleichen Klasse zugreifen kann und main auf die Methode verdopple(...) der gleichen Klasse MainTest1 zugreift, ...

  13. public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); } public double verdopple( double pWert){ return(2*pWert); } } muss verdopple(...) auch eine Klassenmethode werden.

  14. public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); } double pWert){ return(2*pWert); } }

  15. public class MainTest1{ public static void main( String[] args){ double wert; wert = verdopple(4); System.out.println(wert); } public static double verdopple( double pWert){ return(2*pWert); } }

  16. Durch die Benutzung des Klassennamens (und nicht des Namens eines Objekts einer Klasse) wird dann der Literpreis (bzw. Eierpreis) für jedes Objekt einer Klasse festgelegt. In der Klasse Kuh wird dies also z.B. wie folgt realisiert:

  17. Kuh.setLiterpreis(20);setzt für jede Kuh den Preis für ein Liter Milch auf 20 (Cent).Die Methode (hier setLiterpreis ) - nach der Benutzung des Klassennamens - muss dann allerdings eine Klassenmethode sein!

  18. Bemerkung:Hier wird der Bezeichner static immer nach dem Bezeichner für den Zugriffschutz verwendet.Die Bezeichner für den Zugriffschutz und der Bezeichner static können aber auch in der Reihenfolge vertauscht werden. Dies ist dem Kompiler egal Also statt:private static double literpreis;ist auch folgendes möglich:

  19. Also statt: private static double literpreis; static private double literpreis; ist auch folgendes möglich:

  20. Realisieren Sie das vorige Programm mit Hilfe von Klassenmethoden und Klassenvariablen.

  21. class Henne{ private String name; private double legeLeistung; private static double eierPreis; public Henne(String pName, double pEierGewicht){ legeLeistung =pEierGewicht; } public static void setEierPreis( double pEierPreis){ eierPreis=pEierPreis; } } Warum wird hier eine Klassenmethode implementiert und keine Exemplarmethode? Kommt gleich (siehe Anweisung in main)

  22. class Kuh{ private String name; private double milchLeistung; private static double literPreis; public Kuh(String pName, double pMilchLeistung){ milchLeistung =pMilchLeistung; } public static void setLiterPreis( double pLiterPreis){ literPreis=pLiterPreis; } } Warum wird hier eine Klassenmethode implementiert und keine Exemplarmethode? Kommt gleich (siehe Anweisung in main)

  23. public class MainKlassenvar2{ public static void main( String[] args){ Kuh k1 = new Kuh("Elsa", 15); Kuh k2 = new Kuh("Frida", 10); Henne h1 = new Henne("Ute", 3); Henne h2 = new Henne("Pute", 5); Kuh.setLiterPreis(70); Henne.setEierPreis(20); } } Die Methode (hier setLiterpreis bzw. setEierPreis ) - nach der Benutzung des Klassennamens - muss eine Klassenmethode sein! (siehe frühere Folie)

  24. Bemerkung

  25. Vorbelegung von Klassenvariablen

  26. Eine Klassenvariable kann - muß aber nicht - bei der Deklaration (mit static) mit einem Vorgabewert (mit Hilfe des Gleichheitszeichens)initialisiert werden. Wird sie nicht durch einen Vorgabewert initialisiert, wird sie automatisch durch Standardvorbelegungen vorinitialisiert.(gleiche Standardvorbelegungen wie bei den Attributen einer Klasse). Also ...

  27. Beispiel

  28. class Test { private static int x; private static int y = 2; ... } x wird mit 0 vorinitialisiert y wird mit 2 initialisiert

  29. Schreiben Sie ein Programm, in dem (in einer Schleife) z.B. 10 Hennen erzeugt werden.Danach soll in main(...) die Anzahl der Hennen auf dem Bildschirm ausgegeben werden. Realisieren Sie dies mit Hilfe einer entsprechenden Klassenvariablen.Zusätzlich sollen die Hennen (mit 100 beginnend) durchnummeriert werden. Erstellen Sie danach die Hennen h1 und h2. Geben Sie jeweils alle Attribute auf dem Bildschirm aus.

  30. In der folgenden Lösung werden aus Gründen der Vereinfachung ein paar Attribute und Methoden der Klasse Henne eingespart. Man kann also in diesem “übertragenen“, “abgespeckten“ Fall von einer “gerupften“ Henne sprechen:

  31. Um weniger Platz zu verbrauchen schreibt man im Folgenden abkürzend:aus statt System.out.println

  32. class Henne{ private String name; private static int hennenAnzahl; private int nummer; public Henne(String pName){ name = pName; hennenAnzahl++; nummer=hennenAnzahl+100; } Welchen Anfangswert hat diese Klassenvariable ?

  33. class Henne{ private String name; private static int hennenAnzahl; private int nummer; public Henne(String pName){ name = pName; hennenAnzahl++; nummer=hennenAnzahl+100; } Da sie nicht explizit (d.h. durch = ) mit einem bestimmten Wert vorinitialisiert wird, wird sie automatisch mit 0 vorbelegt.

  34. public void setName(String pname){ name = pname; } public String getName(){ return(name); } public static int getAnzahl(){ return hennenAnzahl; } public int getNummer(){ return nummer; } }

  35. package hennennummerieren1; public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); } } Auf welche Hennen kann man am Ende der Schleife zugreifen?

  36. package hennennummerieren1; public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); } } Nur auf die letzte Henne, weil in h (Pointer) der jeweilige Speicher (genauer die Adresse davon) der vorigen Hennen überschrieben wurde. Was passiert dann mit den alten Hennen (genauer mit dem zugehörigen Speicherplatz ?)

  37. package hennennummerieren1; public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); } } Er wird irgendwann von der Java-Müllabfuhr (= Garbage Collector) entsorgt!

  38. package hennennummerieren1; public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); } } Welchen Wert hat das Attribut nummer von h1 und h2 ?

  39. package hennennummerieren1; public class Startklasse{ public static void main(...){ Henne h; for(int i=0;i<10;i++){ h = new Henne("Henne"+i); aus("nummer="+h.getNummer()); } aus("anz="+Henne.getAnzahl()); Henne h1=new Henne("Ute"); Henne h2=new Henne("Heike"); aus("nrh1="+h1.getNummer()); aus("nrh2="+h2.getNummer()); } } h1.nummer = 111 und h2.nummer = 112

  40. Beispiel:Eine Klasse des Java-Systems, d.h. einer Klasse, die mit der Entwicklungsumgebung ausgeliefert wird. Diese Klasse heißt:

  41. Math

  42. Die Klasse Math besitzt Klassenmethoden und Klassenvariablen, wie z.B. die Klassenmethoden:

  43. Liefert eine Zufallszahl zwischen 0 und 1:Math.random()Die Sinusfunktion:Math.sin(...)Die Kosinusfunktion:Math.cos(...)

  44. Und die Klassenvariablen(besser Konstanten):

  45. Kreiszahl public static final double PI 3.14...Eulersche Zahlpublic static final double E 2.71...

  46. Math.PIbzw.Math.Ewird dann darauf zugegriffen.

  47. Realisierung eigener Konstanten mit Java

  48. Bemerkungen:Eine Konstante ist eine Variable, der nur genau einmal ein Wert zugewiesen werden darf.Sie hat den Bezeichner final.Vergleich: Eine CD, die nur genau einmal beschrieben werden kann.

  49. Eine Konstante kann man als eine schreibgeschützte Variable auffassen.(Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

More Related