Grundlagen der Programmierung Teil1 Einheit 1I Okt. 2009

Ähnliche Dokumente
Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

4. Datentypen. Einleitung Eingebaute Datentypen. Konversion / Type-Cast. Operatoren. Übersicht Die Datentypen char, float und double Standardwerte

Ein erstes Java-Programm

Java Einführung Operatoren Kapitel 2 und 3

Javakurs für Anfänger

1 Polymorphie (Vielgestaltigkeit)

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Prinzipielle Ausführungsvarianten I

Dr. Monika Meiler. Inhalt

Primitive Datentypen

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Numerische Datentypen. Simon Weidmann

L6. Operatoren und Ausdrücke

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

5.4 Klassen und Objekte

Propädeutikum zur Programmierung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Modul 122 VBA Scribt.docx

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Diana Lange. Generative Gestaltung Operatoren

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

3 Objektorientierte Konzepte in Java

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Propädeutikum zur Programmierung

OO Programmierung in Java

Kapitel 11: Wiederholung und Zusammenfassung

Handbuch der Java-Programmierung

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Einführung in die Java- Programmierung

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

J.5 Die Java Virtual Machine

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

Datenbankanwendungsprogrammierung Crashkurs Java

Programmieren mit. Java. Lars Knipping. Februar 2002

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Java Virtual Machine (JVM) Bytecode

Java Einführung Methoden in Klassen

Java für Computerlinguisten

Primitive Datentypen. Dr. Wolfgang Süß Thorsten Schlachter

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Modellierung und Programmierung 1

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Java-Vorkurs Wintersemester 15/16

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Objective-C CheatSheet

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Themen der Übung. Java. Java installieren. Java installieren. Installation (Fortsetzung)

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Erster Kontakt mit Java und Pseudocode

Probeklausur: Programmierung WS04/05

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Kapitel 6. Vererbung

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 6. Vererbung

Computeranwendung und Programmierung (CuP)

Dynamische Sprachen auf der JVM

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Deklarationen in C. Prof. Dr. Margarita Esponda

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Programmiervorkurs. Organisation: Steffen Gebert, Alexander Wolff. Tutoren: Jürgen Zöller, Jonathan Stoll. Wintersemester 2012/2013

Übungsblatt 3: Algorithmen in Java & Grammatiken

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Meeting C++ C++11 R-Value Referenzen

Repetitorium Informatik (Java)

Tutorium Java Ein Überblick. Helge Janicke

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

1. Der Einstieg in Java. Was heißt Programmieren?

Objektorientiertes Programmieren für Ingenieure

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Objekt-Orientierte Programmierung

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

Grundwissen Informatik JS September 2015

Die Programmiersprache C

Ab J2SE 5.0 Unterstützung formatierter Bildschirmausgaben. Mit den Operatoren und Klammern können Boolesche Ausdrücke gebildet werden Beispiel:

Repräsentation von Daten Binärcodierung von rationalen Zahlen und Zeichen

Programmierung in C. Grundlagen. Stefan Kallerhoff

Einführung in die Java- Programmierung

Vererbung & Schnittstellen in C#

Dr. Monika Meiler. Inhalt

2 Einfache Rechnungen

Einführung in die C++ Programmierung für Ingenieure

1. Der Einstieg in Java

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

C# im Vergleich zu Java

Grundlagen von Python

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Einführung in die. objektorientierte Programmierung

VisualBasic - Variablen

2. Programmierung in C

Kapitel 6. Vererbung

Programmieren in C/C++ und MATLAB

Javakurs 2013 Objektorientierung

Algorithmen und Datenstrukturen

Transkript:

Grundlagen der Programmierung Teil1 Einheit 1I - 16. Okt. 2009 GDP DDr. Karl D. Fritscher basierend auf der Vorlesung Grundlagen der Programmierung von DI Dr. Bernhard Pfeifer

Einfache Datentypen Java kennt acht elementare Datentypen, die gemäß Sprachspezifikation als primitive Datentypen bezeichnet werden. Daneben gibt es die Möglichkeit, Arrays zu definieren (die eingeschränkte Objekttypen sind), und als objektorientierte Sprache erlaubt Java natürlich die Definition von Objekttypen.

Gleitkommatypen import java.io.*; public class Sample { public static void main (String[] argument) throws } IOException { System.out.println (1/10); } Ergebnis?? Wenn wir das Programm übersetzen und ausführen, so würden wir erwarten, dass als Ergebnis 0.1 am Bildschirm ausgegeben wird. Zu unserer Überraschung wird jedoch 0 ausgegeben. Das ist aber vermeintlich falsch! Aber Achtung! Wir haben im obigen Programm mit Ganzzahlen gearbeitet. Der Divisionsoperator ist in Java jedoch so definiert, dass die Division zweier ganzer Zahlen wiederum eine ganze Zahl ist. Und somit stimmt die Division natürlich: 1 / 10 = 0 mit 1 Rest

Gleitkommatypen Java kennt die beiden Fließkommatypen float (einfache Genauigkeit) und double (doppelte Genauigkeit). Die Länge beträgt 4 Byte für float und 8 Byte für double. Fließkommaliterale werden immer in Dezimalnotation aufgeschrieben. Sie bestehen aus einem Vorkommateil, einem Dezimalpunkt, einem Nachkommateil, einem Exponenten und einem Suffix. Um ein Fließkommaliteral von einem integralen Literal unterscheiden zu können, muss mindestens der Dezimalpunkt, der Exponent oder der Suffix vorhanden sein. Entweder der Vorkomma- oder der Nachkommateil darf ausgelassen werden, aber nicht beide. Vorkommateil und Exponent können wahlweise durch das Vorzeichen + oder - eingeleitet werden. Der Exponent, der durch ein e oder E eingeleitet wird, ist optional. Auch der Suffix kann weggelassen werden, wenn durch die anderen Merkmale klar ist, dass es sich um eine Fließkommazahl handelt. Der Suffix kann entweder f oder F sein, um anzuzeigen, dass es sich um ein float handelt, oder d oder D, um ein double anzuzeigen. Fehlt er, so ist das Literal (unabhängig von seiner Größe) vom Typ double. Gültige Beispiele:????? 47

Gleitkommatypen Neben diesen numerischen Literalen gibt es noch einige symbolische Literale in den Klassen Float und Double des Pakets java.lang. NaN entsteht beispielsweise bei der Division durch 0, POSITIVE_INFINITY bzw. NEGATIVE_INFINITY sind Zahlen, die größer bzw. kleiner als der darstellbare Bereich sind. MAX_VALUE und MIN_VALUE repräsentieren die größte bzw. kleinste darstellbare Zahl.

Gleitkommatypen import java.io.*; public class Sample { public static void main (String[] argument) throws { } } IOException System.out.println (1d/10.); Ergebnis??

Datentyp char Will man mit einzelnen Zeichen arbeiten, so steht der Datentyp char zur Verfügung (2 Byte, UTF -16) Literalkonstanten werden dabei unter ein einfaches Hochkomma gestellt Daten von diesem Datentyp werden intern mit 16 Bit dargestellt (unicode) import java.io.*; public class Buchstabe { public static void main (String[] argument) throws IOException { } } char ersterbuchstabe = 'A'; System.out.println("Der erste Buchstabe des Alphabets ist ein"); System.out.println(ersterBuchstabe);

Datentyp char char wird innerhalb der Java Virtual Machine als int betrachtet: import java.io.*; public class Buchstabe { public static void main (String[] argument) throws IOException { } } char ersterbuchstabe = 'A'; char zweiterbuchstabe = 'B'; System.out.println( Die Addition von erstem und zweitem Buchtaben ergibt"); System.out.println(ersterBuchstabe+zweiterBuchstabe); Ergebnis??

Wahrheitswerte Beim Programmieren steht man des öfteren vor dem Problem, dass man Werte miteinander vergleichen muss. Das Ergebnis des Vergleichs liefert dann WAHR oder FALSCH. In Java existieren die Wahrheitswerte true und false Die Auswertung von logischen Ausdrücken liefert als Ergebnis Werte des Typs boolean Siehe auch Folie Logische Operatoren

Implizite/Explizite Typumwandlung Es kann vorkommen, dass man einen gewissen Datentyp für eine Operation benötigt, jedoch einen anderen vorliegen hat. Will man z.b.: eine 64 Bit Zahl mit einer 32 Bit Zahl addieren, so steht man vor dem Problem, dass die Addition nur für denselben Typ definiert ist. In einem solchen fall benötigt man also eine Typumwandlung, damit die Operation überhaupt durchgeführt werden kann. Bei der oben beschriebenen Problemstellung muss man gar nichts tun. Denn der Compiler erkennt, dass die eine Zahl einen Zahlenbereich hat, der den der anderen Zahl umschliesst. Aus diesem Grund wird einfach die int Zahl in eine long Zahl umgewandet, und die Addition kann ausgeführt werden. Diese (automatische) Vorgehensweise nennt man implizite Typkonvertierung (implicite typecast) Implizite Typkonvertierungen treten immer dann auf, wenn ein kleinerer Zahlenbereich in einen größeren Zahlenbereich abgebildet wird. byte short int long float double

Implizite/Explizite Typumwandlung Eine automatische Konvertierung wird vom Compiler in folgenden Fällen vorgenommen Bei einer Zuweisung, wenn der Typ der Variablen und des zugewiesenen Ausdrucks nicht identisch ist. Bei der Auswertung eines arithmetischen Ausdrucks, wenn Operanden unterschiedlich typisiert sind. int a; float b,c; c=a+b; Beim Aufruf einer Methode, falls die Typen der aktuellen Parameter nicht mit denen der formalen Parameter übereinstimmen. public double dosomething (double a, double b) {... } float x,y,z; Z=doSomething(x,y); 54

Implizite/Explizite Typumwandlung Vorsicht bei Konvertierung in char bzw. von char in byte, short oder int!! Konvertierung von short in char: Class Short2Char { public static void main (String args[]) { char poschar, negchar; Short pos Short = 1; Short negshort = -1; poschar = (char) posshort; neg Char = (char )negshort; } } Da die Breite von short und char gleich ist bleibt das Bitmuster erhalten. Da char aber nur für pos. Ganzzahlige Werte definiert ist, geht jedoch die Bedeutung des Vorzeichens verloren System.out.println( positiver Short + posshort + ist als char +(int) poschar); System.out.println( negativer Short + negshort + ist als char +(int) negchar); Ausgabe: Positiver Short 1 ist als Char 1 Negativer Short -1 ist als Char 65535 54

Implizite/Explizite Typumwandlung Will man beispielsweise eine Variable vom typ double in eine Variable vom Typ int konvertieren, so kann man das nicht so ohne weiteres tun, denn es geht ja durch diese einschränkende Konvertierung Information verloren. Daher nimmt der Compiler an, dass es sich um einen Fehler handelt und gibt eine Fehlermeldung aus: Incompatible type for declaration Explicit cast needed to convert from double to int Der Grund für dieses Verhalten liegt darin begründet, dass es sich bei einer solchen Vorgangsweise häufig um einen Programmierfehler handelt. Um jedoch eine Konvertierung vornehmen zu können, muss man den Compiler dazu zwingen, es zu tun. Dies nennt man explizite Typkonvertierung (explicit typecast): int result = (int) Math.Pi; Eine Umwandlung von boolean in einen anderen Datentyp ist nicht möglich! 55

Definite Assignment In Java gibt es ein Konzept, das sich Definite Assignment nennt. Gemeint ist damit die Tatsache, dass jede lokale Variable vor ihrer ersten Verwendung definitiv initialisiert sein muss. Dazu muss im Quelltext eine Datenflussanalyse durchgeführt werden, die jeden möglichen Ausführungspfad von der Deklaration einer Variablen bis zu ihrer Verwendung ermittelt und sicherstellt, dass kein Weg existiert, der eine Initialisierung auslassen würde. PROBLEM?

Wrapper-Klassen/Objekte Wrapper-Objekte nehmen einen einfachen Datentyp in einem Objekt auf. Damit erfüllen sie zwei wichtige Aufgaben: Die Datenstrukturen, die in Java Verwendung finden, können nur Objekte aufnehmen (zb java.util.vector). So stellt sich das Problem, wie primitive Datentypen zu diesen Containern hinzugefügt werden können. Die Klassenbibliothek bietet daher für jeden primitiven Datentyp eine entsprechende Wrapper-Klasse (auch»ummantelungsklasse«oder»envelope Class«genannt) an. Exemplare dieser Klassen kapseln je einen Wert des zugehörigen primitiven Typs. Zusätzlich zu dieser Eigenschaft bieten die Wrapper-Klassen Funktionen zum Zugriff auf den Wert und einige Umwandlungsfunktionen. Bsp: int i=10; String s = "10"; Integer ii = new Integer( i ); int i = Integer.parseInt( s ); String s = ii.tostring(); float f = Float.parseFloat( s ); Es existieren Wrapper-Klassen zu allen primitiven Datentypen und zusätzlich eine Klasse für void.

Ausdrücke und Operatoren Obwohl wir Ausdrücke schon in unseren ersten kleinen Programmen kennengelernt haben, wollen wir diese jetzt noch einmal etwas genauer unter die Lupe nehmen. Merke: Ein Ausdruck ist die kleinste ausführbare Einheit eines Programms. Ein Ausdruck besteht immer aus mindestens einem Operator und einem oder mehreren Operanden, auf die der Operator angewendet wird. Nach den Typen der Operatoren unterscheidet man zwischen arithmetischen / nummerischen, relationalen, logischen, (bitweise) Zuweisungs, und sonstigen Operatoren (oft als Methode implementiert zb instanceof) Neben dem Typ ist auch die Stelligkeit eines Operators von zentraler Bedeutung (siehe auch Vorlesungsunterlagen vom 9. 10. 2009)

Arithmetische Operatoren Es existiert die Addition, Subtraktion, Multiplikation, Division und der Restwertoperator Zusätzlich gibt es den einstelligen Operator für ein positives oder negatives Vorzeichen Arithmetische Operatoren erwarten numerische Operanden und liefern einen numerischen Rückgabewert. Haben die Operanden unterschiedliche Datentypen, so wird ein automatischer Type-Cast durchgeführt. + positivesvorzeichen +n gleichbedeutend mit n - negatives Vorzeichen -n kehrt das Vorzeichen um + Summe a+b ergibt Summe von a,b - Differenz a-b * Multiplikation a*b / Quotient a/b % Restwert a modulo b ++ Prä/Postinkement a=a+1 -- Prä/Postdekrement a=a-1

Relationale Operatoren Relationale Operatoren dienen dazu, Ausdrücke miteinander zu vergleichen und in Abhängigkeit davon einen logischen Rückgabewert zu produzieren == Gleich a==b => true wenn a=b!= Ungleich a!=b => true wenn a ungleich b < Kleiner a<b => true wenn a kleiner b <= Kleiner gleich a<=b => true wenn a kleiner oder gleich b > Größer a>b >= Größer gleich a>=b 59

Logische Operatoren Logische Operatoren dienen dazu, boolsche Werte miteinander zu verknüpfen. Im Gegensatz zu relationalen Operatoren, die durch Vergleiche einen boolschen Wert produzieren, werden logische Operatoren zur Weiterverarbeitung von Wahrheitswerten verwendet. Es gibt die Grundoperationen UND, ODER und NICHT. UND und ODER werden in zwei Varianten zur Verfügung gestellt: Short-Circuit-Evaluation es wird ein logischer Ausdruck (weiter rechts) nur dann ausgewertet, wenn er für das Ergebnis noch von Bedeutung ist keine Short-Circuit-Evaluation! logisches NICHT!a => false, wenn a true und vice versa && UND mit SCE ODER mit SCE & UND ohne SCE a&&b => true wenn a und b true sonst false a b => true, wenn mind. einer der Ausdrücke true ist, sonst false ODER ohne SCE ^ Exklusiv-Oder a^b => true, wenn beide Ausdrücke einen unterschiedlichen Wert haben

Bitweise Operatoren Mit diesen Operatoren kann auf die Binärdarstellung von numerischen Operanden zugegriffen werden. Ein numerischer Datentyp wird dabei binär (dual) repräsentiert, und es können die einzelnen Bits direkt manipuliert werden. ~a entsteht aus a, indem alle Bits von a invertiert ~ Einerkomplement werden & bitweises UND a&b ergibt den Wert, der entsteht, wenn die korrespondierenden Bits von a und b miteinander UND verknüpft werden bitweises ODER ^ bitweises XOR a b ergibt den Wert, der entsteht, wenn die korrespondierenden Bits von a und b miteinander ODER verknüpft werden >> rechtsschieben mit Vorzeichen a>>b schiebt um b bits in a nach rechts >>> << rechtsschieben ohne Vorzeichen linksschieben

Bitweise Operatoren Beispiele: 14 & 1 1110 & 0001 = 14 1 1110 0001 = 0000 1111 = 15 8 >>3 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000001 = abschneidende Ganzahldivision durch 8 (=2 3 ) -7 >> 3 11111111 11111111 11111111 11111001 11111111 11111111 11111111 11111111-7 >>> 3 11111111 11111111 11111111 11111001 00011111 11111111 11111111 11111111

Zuweisungsoperatoren = Einfache Zuweisung += Additionszuweisung a+=3; entspricht a=a+3; -= Subtraktionszuweisung *= Multiplikationszuweisung /= Divisionszuweisung %= Modulozuweisunng &= UND Zuweisung a&=b weist a den Wert zu von a&b = ODER Zuweisung ^= XOR Zuweisung <<= Linksschiebungszuweisung >>= Rechtsschiebungszuweisung

Sonstige Operatoren Fragezeichenoperator Type-Cast Operator Bsp: int c = (int) 4.2; InstanceOf Operator Bsp: BMW instanceof Auto 63 63

Priorität von Operatoren Wie bereits erwähnt sind Operatoren sind in Java mit so genannten Prioritäten versehen, wodurch gewisse Reihenfolgen bei der Auswertung (=operator ranking) eingehalten werden Darüber hinaus gibt es folgende Regeln zur Auswertung eines Ausdrucks in JAVA: 1. Als erstes werden Teilausdrücke in Klammern ausgewertet. 2. Danach werden Ausdrücke mit unären Operatoren ausgewertet 3. Abschließend werden Teilausdrücke mit mehrstelligen Operatoren ausgewertet 4. Bei Operatoren mit gleicher Priorität (siehe auch Tabelle) wird die Reihenfolge der Auswertung anhand Ihrer Assoziativität bestimmt Bsp: a b + c. Es wird zuerst die Operation a-b durchgeführt bevor die Addition mit c erfolgt -> linksassoziativ (beachte Reihenfolge der Auswertung kann durch Setzung von Klammern beeinflusst werden: a-(b+c) (siehe auch Regel 1)) In Java sind Zuweisungsoperatoren, der Bedingungsoperator und unäre Operatoren rechtsassoziativ. Alle anderen Operatoren sind linksassoziativ.

Priorität von Operatoren Wie bereits erwähnt sind Operatoren sind in Java mit so genannten Prioritäten versehen, wodurch gewisse Reihenfolgen bei der Auswertung eingehalten werden (Punkt vor Strich)

Operatoren für Objekte Auch wenn wir noch nicht genau wissen, wie man ein Objekt erzeugt, bzw. was ein Objekt ist, so wollen wir uns trotzdem der Vollständigkeit halber anschauen, welche Operatoren für Objekte zur Verfügung stehen. String Verkettung Der + Operator kann nicht nur mit numerischen Operanden verwendet werden, sondern auch für eine Konkatenation von Strings - also Zeichenketten. Dabei gilt es folgende Regel zu beachten: Ist ein Operand vom Typ String, so werden alle weiteren als Typ String betrachtet und der + Operator wird als Konkatenator verwendet. In Java ist die Konvertierung in einen String von nahezu jeden Typen definiert. Bei primitiven Datentypen wird diese Konvertierung direkt vom Compiler, und bei Referenzdatentypen durch die Methode (Funktion) tostring() ausgeführt. System.out.println ( 3+4= +3+4); System.out.println ( 3+4= +(3+4));

Referenztypen-Dynamische Variablen Referenztypen sind neben den primitiven Datentypen die zweite wichtige Klasse von Datentypen in Java. Objekte sind Referenztypen Objekte werden in Java als dynamische Variablen angelegt auf dem Heap abgelegt HEAP??

Speicherbereiche in JAVA In Java unterschiedet man 3 verschiedene Speicherbereiche Stack Heap Method Area Stack (=Stapel): Informationen werden hier temporär abgelegt Im Stack werden zb lokale Variablen einer Methode gespeichert Auf Information, die zuletzt abgelegt wurden, kann als erstes wieder zugegriffen werden ( last in first out = LIFO stack) Heap (=Halde): stellt Speicherplatz für dynamische Variablen zur Verfügung Größe des Heaps ist beschränkt Garbage Collector gibt Speicherplatz der nicht mehr referenziert wird frei und ordnet Speicherbereich neu Method Area: Speicherbereich für Klassenvariablen Plus gesamter Programmcode der Klasse

Referenztypen-Dynamische Variablen Speichermanagement Während primitive Datentypen einfach deklariert werden, und dann verwendet werden können, reicht dies bei Referenztypen nicht mehr aus. Sie müssen mithilfe des new-operators erzeugt werden (Ausnahme Arrays und Strings) StringBuffer mystringbuffer = new StringBuffer (); Auto mercedes = new Auto(150,rot); Klasse / Typ Var.-Name Operator Konstruktor Parameter (Spez. Methode zur Initialisierung eines Objekts) Was passiert im Speicher??

Speicherbereiche in JAVA Stack Nicht definierte Referenz Stack Auto bmw; bmw bmw = bmw new Auto(150,rot); Definierte Referenz: Das im Heap erzeugte Objekt wird referenziert. Heap Heap Auto-Objekt

Referenztypen-Dynamische Variablen Referenztypen können prinzipiell genauso benutzt werden wie primitive Typen. Da sie jedoch lediglich einen Verweis (Alias) darstellen, ist die Semantik einiger Operatoren anders als bei primitiven Typen Die Zuweisung einer Referenz kopiert lediglich den Verweis auf das betreffende Objekt. Das Objekt selbst wird nicht kopiert. Nach einer Zuweisung zweier Referenztypen zeigen diese also auf ein und das selbe Objekt. Sollen Referenztypen kopiert werden, so ist ein Aufruf der Methode clone()erforderlich Der Gleichheitstest zweier Referenzen testet, ob beide Verweise gleich sind, d.h. auf dasselbe Objekt zeigen. Soll auf inhaltliche Gleichheit getestet werden, so kann die equals() Methode verwendet werden.

Referenztypen Wie wir bereits gehört haben verfügt Java über ein automatisches Speichermanagement. Dadurch muss man sich nicht um die Speicherbereinigung kümmern. Wird ein Objekt nicht mehr benötigt, oder kann es nicht mehr erreicht werden, so wird es vom Garbage Collector entfernt. Um trotz des Verzichts auf die expliziten Destruktoren (=Objektvernichter) doch noch bestimmte Anweisungen direkt vor der Entfernung von Objekten durchführen zu können, besitzt jede Klasse die Methode finalize(): Ähnlich wie der implizite Konstruktor (Objekterzeuger und Initialisierer) muss diese Methode nicht extra implementiert werden. Es kann aber auch ein expliziter Finalizer geschrieben werden. Die Methode finalize() eines Objektes wird automatisch aufgerufen, bevor es vom Garbage Collector entfernt wird.

Arrays Wie bereits erwähnt sind Arrays in Java im Grunde genommen Objekte. Obwohl dies bei der Benutzung kaum auffällt hat dies folgende Konsequenzen: Array Variablen sind Referenzen Arrays besitzen Instanz-Variablen und Methoden Arrays werden erst zur Laufzeit erzeugt Dennoch bleiben Arrays immer eine Reihung von Elementen eines festen Grundtyps. Arrays sind semidynamisch - d.h. ihre Größe wird zur Laufzeit festgelegt, kann jedoch im Nachhinein nicht mehr geändert werden.

Arrays Ein Array wird in Java wie folgt deklariert Deklaration der Array-Variablen Erzeugen eines Arrays und Zuweisung an die Array-Variable Die Deklaration entspricht dabei syntaktisch der einer einfachen Variable, mit dem Unterschied, dass am Typnamen eckige Klammern angehängt werden int[] a; double [] b; Die eckigen Klammern können theoretisch auch hinter dem Variablennamen geschrieben werden, aber es sollte jedoch vermieden werden. 71

Zugriff auf Arrayelemente Bei der Erzeugung eines Arrays mit n Elementen werden die Elemente von 0 bis n-1 durchnummeriert Erzeugung eines int-arrays mit 3 Elementen oder a[] = new int[3]; Int[] a = {1, 5, 3}; Der Zugriff auf die Elemente erfolgt dabei über den numerischen Index, der nach der Arrayvariable in eckigen Klammern angegeben wird values ai 20 15 2 44 77 12 2 9 0 1 index i 0 1 2 3 4 5 6 7 8 9 public class Test { public static void main (String[] args) { int[] values = new int[10]; values[0] = 20; values[1] = 15; } } System.out.println ( Erstes Element: + values[0]);

Mehrdimensionale Arrays Mehrdimensionale Arrays werden erzeugt, indem zwei oder mehr Paare eckiger Klammern bei der Deklaration angegeben werden. Mehrdimensionale Arrays werden als Arrays von Arrays angelegt. Die Initialisierung erfolgt analog zu eindimensionalen Arrays. Beispiel: int [][] twodim = new int[2][3]; 74

Zeichenketten -Strings Mehrere Zeichen des Datentyps char können zu einer Zeichenkette zusammengefasst werden. Zeichenketten werden dabei als Strings bezeichnet. Strings werden in Java allerdings nicht als Werte eines einfachen Datentyps gewertet, sondern stellen Objekte dar (siehe auch link) Strings werden unter einem doppelten Hochkomma eingeschlossen Für die Erzeugung eines String Objekts gibt es 2 Möglichkeiten: 1. Mit dem new Operator: String name = new String( Klaus ); 2. Implizite Erzeugung bei Verwendung einer konstanten Zeichenkette: String name = Klaus ; Implizit erzeugte String Objekte können wiederverwendet werden:.class Datei kleiner Interpreter kann Klassenübergreifend optimieren String name = Klaus ; String gleichername = Klaus ; name gleichername Heap String Klaus

Übungsfragen 1. Was versteht man unter Typumwandlung? 2. Wie kann es bei einer Typumwandlung zu unerwünschten Veränderungen im Wert kommen? 3. Was versteht man unter expliziter bzw. impliziter Typumwandlung? Nennen sie jeweils ein Beispiel. 4. Was sind Operatoren? In welche Klassen können Operationen eingeteilt werden? 5. Was versteht man unter der Priorität eines Operator s? In diesem Zusammenhang fällt auch manchmal der Begriff operator ranking. Was versteht man darunter?