Welche Zahlenwerte neben dem Dezimalsystem (b=10) werden häufig in der Informatik verwendet?
das Dualsystem (Binärsystem, b = 2)
das Hexadezimalsystem (b = 16)
in älteren Anwendungen auch das Oktalsystem (b = 8)
die Darstellung von ganzen Zahlen
Gegeben: ganzzahlige Zahl b > 1
Jede endliche ganze Zahl x kann durch ihre b-adische Entwicklung im Stellenwertsystem folgendermaßen dargestellt werden:
es gilt:
n >= 0
xi ist eine Ziffer zwischen 0 und b-1
Wenn xn ungleich 0 ist, dann ist n+1 die Stellenzahl zur Basis b
Darstellung von Zahlen in Java
in den Datentypen byte, short, int und long wird die Basis b = 2 und eine feste Anzahl von n = 8, 16, 32, 64 Bits (binären Ziffern) eingesetzt
der erste Bit legt das Vorzeichen fest:
0 = Plus
1 = Minus
-> somit bleiben n-1 Bits für den Wert
Wie werden negative Zahlen dargestellt?
sie werden im Zweierkomplement dargestellt:
zunächst werden alle Bits negiert und dann wird eine 1 addiert
Welche Zahlenbereiche können mit welchem Datentyp dargestellt werden?
Der Überlauf bei ganzzahligen Typen
wird der Zahlenbereich des Datentypen überschritten kommt es zum Überlauf
Achtung: bei ganzzahligen Typen in Java wird der Überlauf nicht erkannt! es wird weitergerechnet
die Darstellung von reellen Zahlen bzw. Gleitkommazahlen
Jede reelle Zahl x kann durch ihre b-adische Entwicklung im Stellenwertsystem folgendermaßen dargestellt werden:
Der Überlauf bei Gleitkommazahlen
bei Gleitkommazahlen kann ebenfalls Überlauf auftreten, wenn die betragsmäßig größte darstellbare Zahl überschritten wird
es wird kein unsinniges negatives Ergebnis eingesetzt (wie bei ganzen Zahlen) sondern der spezielle Wert +∞ bzw. −∞. -d amit kann in der Regel normal weiter gerechnet werden
kann auch zu stark verfäschten Ergebnissen führen:
weitere Ausnahmen bzw. Schwierigkeiten die beim Darstellen von/Arbeiten mit Gleitkommazahlen auftauchen können
Unterlauf (Exponent zu klein), es wird mit 0 weiter gerechnet
Division durch 0: es wird mit Unendlich weiter gerechnet
illegale Operation (0/0, ∞ − ∞, usw.): es wird NaN (not a number) als Ersatzergebnis eingesetzt
ein ungenaues Ergebnis: dies ist fast immer der Fall und wird ignoriert
Allgemeines zu Feldern
viele gleichartige Daten werden zusammen abgespeichert in sog. Feldern
-> beispielsweise Vektoren, Matrizen, Tabellen oder Monitorbilder als eine Matrix von Pixeln
die Einträge in einem Feld heißen Elemente oder Komponenten
alle Komponenten sind vom gleichen Typ (Komponententyp)
es sind Objekte, die dynamisch erzeugt werden und sind im Prinzip eindimensional (können aber als Komponententyp einen anderen Feldtyp besitzen)
Felder in Java
die Bezeichnerliste ist eine mit Komma getrennte Liste von Namen für Feldvariablen - alle haben den gleichen Komponententyp
alternativ ist auch noch die C++ Syntax möglich:
Achtung: anders als bei anderen Programmiersprachen wird durch die Deklaration noch kein Speicherplatz reserviert, sondern bislang nur eine Referenz auf das Feld!
Folgende vier Möglichkeiten gibt es um Felder zu Erzeugen
mithilfe des Operators new lässt sich ein Feld mit der Länge l erstellen:
durch eine Initialisiererliste bei der Deklaration, mit der direkt auch die Elemente zugewiesen werden können:
durch Zuweisung eines mit new erzeugten Feldes:
durch eine Kombination aus (2) und (3):
Dürfen auch Variablen und Ausdrücke in der Initialisiererliste stehen?
Ja, aber dabei dürfen nur definierte Größen verwendet werden!
Die Länge eines Feldes
die Länge kann mit einer ganzzahligen Variablen oder einem ganzzahligen Ausdruck angegeben werden
der Ausdruck muss vom Typ int sein, nicht vom Typ long
jedes Feld f besitzt eine Komponente f.length vom Typ int, die seine aktuelle Komponentenanzahl angibt:
Zugriff auf Feldkomponenten
ist i ein ganzzahliger Ausdruck, so kann mit f[i] auf das i-te Feldelement von dem Feld f zugegriffen werden
hierbei muss der Ausdruck i vom Typ int sein, long ist nicht erlaubt!
Felder und illegale Zugriffe
die Indizierung der Feldelemente beginnt in Java immer bei Null -> Zugriffe auf nicht existente Feldelemente werden in Java geprüft und führen zu einem Laufzeitfehler
die Indizes der Felder können nicht größer/gleich der Länge des Feldes sein
Felder als Referenzen
werden wie alle Objekte, als Referenzen behandelt
eine Zuweisung mit dem Zuweisungsoperator = kopiert nur die Referenzvariable (gewissermaßen ein Aliasname), jedoch keine echte Kopie der Inhalte
-> bei Grundtypen wird gewöhnlich bei Nutzung des Zuweisungsoperators der Wert kopiert, bei Referenztypen jediglich nur die Referenz und der Wert selbst nicht:
Vorteil: eine solche Wertzuweisung kann extrem schnell ausgeführt werden- sie braucht für ein beliebig großes Feld praktisch keine Rechenzeit
Nachteil: kann zu unerwarteten Ergebnissen führen (siehe Beispiel oben)
Wiederholung zu eindimensionalen Felder
Felder fassen Objekte gleichen Types zusammen
sie sind selbst Objekte und werden deshalb als Referenzen behandelt
die Deklaration erzeugt nur eine Referenz auf das Feld, sie reserviert keinen Speicher für die Komponenten - das geschieht durch die Initialisierung
die Indizierung der Feldelemente beginnt in Java immer bei Null
über den Zuweisungsoperator = wird nur die Referenzvariable kopiert und nicht der Inhalt
Was ist der Zweck von Methoden?
man kann sich Quelltext sparen, da mehrfach vorkommender Quelltext zusammengefasst werden kann
können in anderen Programmen leicht wieder verwendet werden
Programme können übersichtlicher gestaltet werden
können seperat voneinander getestet werden
-> reduziert Fehlermöglichkeiten
Die Syntax von Methoden
die formale Parameterliste/Argumentliste setzt sich jeweils aus der Typspezifikation und dem zugehörigen Bezeichner zusammen und wird durch Kommata getrennt wie folgt:
Welche Regeln gelten für die formale Parameterliste?
formale Parameter sind spezielle Variablen, die Werte an eine Methode übergeben -> in der Methode dürfen sie als normale Variable verwendet werden
die formale Parameterliste darf zwar leer sein, die runden Klammern müssen aber trotzdem immer da stehen
für jeden Parameter muss eine eigene Typsezifikation existieren
Sind Referenztypen als Parameter oder als Ergebnis zugelassen?
Ja, Referenztypen sind als Parameter und als Ergebnis zugelassen, d.h. Zeichenketten, Feldtypen und beliebig andere Objekte sind zugelassen.
der Rückgabewert und die return-Anweisung
die Rückgabe eines Ergebnisses erfolgt über die return-Anweisung -> mit der return-Anweisung wird die Methode abgebrochen und das angegebene Ergebnis zurückgeliefert.:
der Ausdruck muss dabei zuweisungskompatibel zum Typ der Methode sein (also gleicher Typ oder automatisch konvertierbar)
es muss ein return durchlaufen werden ansonten kommt es zu einem Fehler -> häufige Fehlerquelle
void-Methoden
wird genutzt wenn kein Ergebnis gewollt ist -> ohne Rückgabewert
die return-Anweisung muss nicht explizit, aber kann angegeben werden und geschieht automatisch am Ende
die main-Methode
ist eine bekannte void-Methode
hat kein Ergebnis
aber gibt meistens Werte über die Standardausgabe aus oder schreibt Ergebnisse in Dateien
eine Methode muss in der main-Methode aufgerufen werden (wenn auch nur indirekt)
der Methodenaufruf
um Methoden zu verwenden, muss man sie aufrufen!
die aktuelle Parameterlister braucht genauso viele Parameter wie die formale Parameterliste -> der Reihenfolge entsprechend werden die Parameter zugeordnet
die aktuellen Parameter müssen zuweisungskomptaibel sein zu den formalen Parameter
in Java werden alle Parameter einer Methode als Werteparameter übergeben
leere Parameterlisten
ist die formale (und damit auch die aktuelle) Parameterliste leer, so müssen die runden Klammern trotzdem stehen:
Änderung von formalen Parametern
der aktuelle Parameter lässt sich bei einer Übergabe als Werteparameter nicht verändern -> bei Referenztypen ist dies mit Einschränkungen möglich
Wertzuweisungen an den entsprechenden formalen Parameter sind erlaubt und wirken sich nur innerhalb der Methode aus
Argumente mit Ausdrücken
in den aktuellen Argumenten/Parametern dürfen wieder Ausdrücke stehen!
die Parameter werden von links nach rechts ausgewertet:
Was muss man bei Methoden beachten? (4 Punkte)
die Schachtelung von Methoden ist nischt erlaubt (anders als in anderen Sprachen) -> Methoden müssen stets auf äußerster Ebene in einer Klasse definiert werden
die Reihenfolge der Definitionen von Methoden spielt in Java keine Rolle
lokale Variablen dürfen nicht den gleichen Namen wie ein formaler Parameter haben
aktuelle und die zugehörigen formalen Parameter dürfen die gleichen Bezeichner haben - es sind in jedem Fall verschiedene Variablen
Können mehrere Methoden den gleichen Namen haben?
ja, können sie, aber die Methoden müssen unterschiedliche Parameterlisten besitzen
entscheidend sind hierbei die Typen, nicht die Namen der formalen Parameter
der Ergebnistyp ist frei wählbar
allerdings ist es nicht erlaubt, dass sich die Methoden nur in ihrem Ergebnistyp unterscheiden
→ Signatur: Name und Parameterliste sind entscheidend
Methoden mit beliebig vielen Parametern
durch folgende Syntax kann ein formaler Parameter wie ein Feld angesprochen werden innerhalb der Methode:
der mit ... gekennzeichnete formale Parameter muss der letzte in der Parameterliste sein:
beim Aufruf der Methode können beliebig viele aktuelle Parameter passenden Types angegeben werden -> ein Feld passenden Typs ist ebenfalls erlaubt
dies entspricht einer (unendlichen) Folge von überladenen Funktionen
es dürfen keine Mehrdeutigkeiten durch weitere überladene Funktionen entstehen
Wiederholung von Methoden
mit Methoden können Programme übersichtlicher gestaltet und Fehlermöglichkeiten reduziert werden
beim Aufruf einer Methode wird ihr die aktuelle Parameterliste übergeben
dabei wird jeder Parameter mit dem an der entsprechenden Stelle stehenden formalen Parameter identifiziert (sie benötigt deshalb die gleiche Anzahl an Argumenten)
die Methode selbst führt ihre Anweisungen mit den Werten dieser Variablen aus
der Ausdruck nach dem return ist das, was die Methode als Ergebnis liefert
auch Referenztypen sind als Ergebnisse von Methoden zugelassen
der Ausdruck bei der return-Anweisung muss nur zuweisungskompatibel zum Typ der Methode sein und immer durchlaufen werden
dei der void-Methode muss die return-Anweisung nicht explizit angegeben werden
unterschieden werden Methoden anhand des Namen und der Parameterliste (Signatur), d.h. mehrere Methoden mit gleichem Namen können existieren
Eine Variante der for-Schleife zum Durchlaufen von Feldern
der Elementtyp entspricht dem Typen des Feldes und die Feldvariable entspricht dem Namen des Feldes
die for-Schleife durchläuft alle Elemente des Feldes
Anmerkung: In der objektorientierten Programmierung kann mit der gleichen Syntax ein Iterator eine Collection durchlaufen
Felder als Parameter
Felder sind als Parameter bei Methoden erlaubt
die Dimension darf nicht angegeben werden, sie kann über .length bestimmt werden
-> die Länge des Feldes darf nicht angegeben werden, aber steht zur Verfügung beim Aufrufen der Methode
Referenztypen
Felder sind Referenztypen wie alle Objekte (Klassen, Strings)
bei Referenztypen enthält eine Variable nicht den eigentlichen Inhalt (z.B. Zahlen in den Feldelementen), sondern nur eine Referenz darauf (Pointer, Zeiger, Verweis, Adresse)
Referenzvariablen werden per Wertaufruf übergeben – genau wie alle anderen Variablen
d.h. die Referenz wird in eine lokale Variable kopiert -> folglich wird die aktuelle Größe im aufrufenden Programm durch Wertzuweisungen an den formalen Parameter in der Methode nicht verändert
ein Vorteil hierbei ist, dass eine solche Parameterübergabe extrem schnell ausgeführt werden kann -> sie braucht für ein beliebig großes Feld (oder Objekt) praktisch keine Rechenzeit
Referenztypen als Parameter
die Werte, auf die die Referenz verweist, werden bei der Parameterübergabe einer Methode nicht kopiert und können deshalb verändert werden!
diese Vorgehensweise entspricht u.a. aus folgenden Gründen nur teilweise dem Referenzaufruf aus anderen Programmiersprachen (Pascal var, C++ &)
-> in Java wurde aus Sicherheitsgründen die Möglichkeit von Referenzaufrufen bewusst eingeschränkt
-> d.h. Grundtypen sind immer Werte, Objekte sind immer Referenzen
deshalb werden Grunddatentypen immer call-by-value und Felder immer call-by-reference übergeben
Zuletzt geändertvor 5 Monaten