Ein kleines inoffizielles Script zu Allgemeine Informatik 2. Autor: Martin Rickes

Größe: px
Ab Seite anzeigen:

Download "Ein kleines inoffizielles Script zu Allgemeine Informatik 2. Autor: Martin Rickes"

Transkript

1 Ein kleines inoffizielles Script zu Allgemeine Informatik 2 Autor: Martin Rickes

2 Ich danke allen, die an diesem Script mitgeholfen haben. Besonderer Dank gilt: Stefanie Mühlsteph, die die Befehlssammlung (Anhang A) geschrieben hat. Thomas Stein, Lektor Henning Janssen, Lektor Florian Bahlke, Lektor

3 1 Vorwort Der zugrunde liegende Gedanke für dieses Script ist nicht ganz uneigennütziger Natur. Es gibt verschiedene Gründe, warum dieses Script überhaupt, und in dieser Form geschaffen wurde. Der wohl wichtigste ist, dass der Autor sich ebenfalls mit AI-2 herumzuschlagen hat und daher zwecks des besseren Lernens eine Zusammenfassung schreibt. Ein weiterer Punkt ist, dass es eine sehr gute Übung ist, L A TEX zu lernen. Nicht zuletzt ist es auch eine hervorragende Übung, eine wissenschaftliche Publikation zu schreiben. Der Autor bittet daher eine etwas hochgestochene Sprache ( der Autor ) und gewisse Spielereien mit den Möglichkeiten von L A TEX zu entschuldigen. Die Programmierbeispiele sind entweder geistiges Eigentum des Autors oder von anderen Stellen dreist geklaut. In der Hauptsache richtet sich dieses Script aber nach den Folien der AI-2-Vorlesung im Sommersemester 2008 von Prof. Koch. Im Gegensatz zur Veranstaltung wird für dieses Script die Eclipse-Entwicklungsumgebung anstelle von BlueJ verwendet werden. Dies liegt in einer tiefen Abneigung seitens des Autors gegenüber BlueJ begründet. Eine wichtige Anmerkung: Dieses Script ist inoffiziell, es besteht keine Garantie auf Vollständigkeit und inhaltliche Korrektheit. Konstruktive Kritik, Erweiterungen, Verbesserungen sind ausdrücklich erwünscht. Beschimpfungen und Drohungen, weil man sich zwei Tage vor der Klausur das Script auf dem Klo mal durchgelesen hat und erstaunlicher Weise durch die Klausur gefallen ist, sind nutzlos. Außer sie sind geistreich oder witzig. Martin Rickes, Darmstadt 2008 i

4 2 Zusammenfassung In der Veranstaltung Allgemeine Informatik 2 geht es um Java. Wer hätte das gedacht... ii

5 Inhaltsverzeichnis 1 Vorwort i 2 Zusammenfassung ii 3 Java - was, wann, warum, wieso Historie der Programmiersprache Java Compiler VS. Interpreter Java-Bytecode und die Java-Virtual-Machine Java-Laufzeitsystem Einsatz von Java-Programmen Was braucht man zum Arbeiten mit Java? Einführung in BlueJ 6 5 Wichtige Regeln für die Programmierung in Java Sprachaufbau Lexikalische Ebene Syntaktische Ebene Semantische Ebene Logische Ebene Spezifikatorische Ebene Einige Grundregeln für das Programmieren in Java Datentypen Eingebaute Datentypen Datentyp char Datentypen float und double Der Standardwert Operatoren Relationale Operatoren Arithmetische Operatoren Logische Operatoren/Short-Circuit Zuweisungsoperatoren Type-Cast Ausdrücke Klassen und Objekte Datenfelder Konstruktoren Methoden Variablen in Klassen Variablen und deren Gültigkeit Konstanten Literale Scope Lebenszeit Garbage Collection Methoden und deren Aufrufe Pakete und Klassenpfade Objekt- und Klassenmethoden Überladung

6 9 Programmfluss Was bedeutet Programmfluss? Schleifen while-schleifen do-while-schleife for-schleife Steuerung im Schleifenrumpf Bedingungen und Verzweigungen Rückgabetypen und Return Seiteneffekte Interne Realisierung von Methoden Rekursion Verweise und Referenzen Das Schlüsselwort this Objekte und Referenzen Erweiterte und Komplexe Datentypen Rekursve Datentypen Bäume Vererbung Abstrakte Methoden und Interfaces Abstrakte Methoden Interfaces und Mehrfachvererbung Das Java Collection Interface Exceptions Schlusswort 44 A Befehlssammlung 45 B Changelog 48 2

7 3 Java - was, wann, warum, wieso Java ist eine objektorientierte Programmiersprache und eingetragenes Warenzeichen der Firma Sun Microsystems. Zu Java im Allgemeinen zählt nicht nur die Programmiersprache, sondern auch weitere Komponenten. Besonders zu nennen sind hier das Java-Runtime-Environment (JRE) und die Java-Virtual-Machine (JVM). Der aktuelle Stand ist die Version Historie der Programmiersprache Java Die Entwicklung von Java begann 1991 bei Sun Microsystems unter dem Arbeitstitel Object Application Kernel (OAK). Dieser wurde später aus rechtlichen Gründen in Java umbenannt. Die Entwicklung des OAK war Teil des Green-Project, welches auf Basis eines portablen Minicomputers (Star-Seven) eine Lösung für interaktives Fernsehen und weitere Produkte der Consumer-Elektronik darstellen sollte. Ende 1991 war der erste lauffähige OAK entwickelt und führte erste Programme aus wurde das Projekt Sun-Intern vorgestellt und stieß auf große Resonanz, die Firma First Person Inc. wurde geschaffen. Bereits 1994 bestand Konsens darüber, dass die Hardwareplattform Star-Seven überholt ist und es wurde begonnen, sich nur noch auf die Software zu konzentrieren wurde die Firma JavaSoft gegründet und Star-Seven damit endgültig begraben. Java ist prinzipiell stark an die deutlich ältere und verbreitete Programmiersprache C/C++ angelehnt, was den Umstieg für C-Programmierer erleichtern und so für eine höhere Akzeptanz sorgen sollte. Als Beispiel wären hier die Zuweisungen bzw. die Überprüfung auf Gleichheit zu nennen. Sowohl Java, als auch C++ benutzen = für Zuweisungen und == für die Überprüfung auf Gleichheit. Pascal/Delphi hingegen benutzt := für Zuweisungen und = für Gleichheit. Der Hauptunterschied zwischen Java und C/C++ besteht im dem Grad der Freiheit, welcher dem Programmierer eingeräumt wird. In C++ hat der Entwickler alle Freiheiten und Möglichkeiten. Dies birgt allerdings viele potenzielle Fehlerquellen und bringt daher ein großes Maß an Eigenverantwortung für den Entwickler mit sich. Bei Java hingegen ist alles Sinnlose von vorne herein verboten. Dies kann sich in manchen, speziellen Situationen als hinderlich erweisen, nimmt dem Entwickler aber einiges an Verantwortung ab. 3.2 Compiler VS. Interpreter Ein großes Problem bei der Programmierung ist die Schnittstelle Mensch-Maschine. Der Mensch (Programmierer) möchte eine möglichst lesbare, Programmiersprache benutzen. Die Maschine versteht nur Maschinensprache, also Assambler/Binärcode. Das heißt, der Programmierer erstellt eine oder mehrere Dateien mit Code, welcher für den Computer übersetzt werden muss. Um diese Lücke zu füllen, existieren zwei unterschiedliche Verfahren: Zum ersten der Compiler und zum zweiten der Interpreter. Der Compiler erstellt aus dem Source-Code, also den vom Programmierer geschriebenen Dateien, eine vom Computer ausführbare Datei in Maschinensprache. Unter Windows wird z.b. der Code in eine.exe-datei umgewandelt. Diese Dateien auszuführen geht sehr schnell, das Compilieren kann hingegen sehr lange dauern, ist aber ein einmaliger Vorgang, der nicht wiederholt werden muss. Die compilierten Dateien können vom jeweiligen Betriebssystem als normaler Prozess ausgeführt werden. Im Gegensatz dazu steht der Interpreter. Der Interpreter schreibt keine ausführbare Datei, sondern führt den Source- Code direkt aus. So wird die Zeit zum compilieren eingespart, allerdings dauert die Ausführung länger. Der Interpreter übersetzt den Quelltext bei jeder Ausführung erneut. Eine Analogie könnte in der Rede eines ausländischen Politikers gefunden werden. Eine Zeitung compiliert die Rede, man kann sie am nächsten Tag in der Zeitung abgedruckt ins Deutsche übersetzt lesen. Eine Fernsehstation mit Live- Übertragung hingegen interpretiert die Rede, hier wird ein Simultanübersetzer eingesetzt. Prinzipiell kann jede Sprache sowohl compiliert als auch interpretiert werden, dies macht aber aus Sicht der Anwendung nicht immer Sinn. HTML z.b. wird immer Interpretiert, der Browser übersetzt den Seiten-Quelltext beim Aufruf in die richtige Formatierung. C/C++ hingegen wird compiliert, da diese Sprachen oft für komplexe und große Programme eingesetzt werden und hier ein Interpreter zu langsam wäre. 3

8 3.3 Java-Bytecode und die Java-Virtual-Machine Im vorangegangenen Teil wurden die Unterschiede zwischen Compiler und Interpreter dargelegt. Im Falle von Java wird sowohl ein Compiler als auch ein Interpreter verwendet. Dies wird bedingt durch die Forderung, dass Java plattformunabhägig, also auf jedem Betriebssystem, laufen soll. Der Compiler compiliert den Source-Code in den sog. Java- Bytecode, eine spezielle Form des Maschinencodes, welche insbesondere auf die Anforderungen der Java-VM angepasst ist. Zusätzlich enthält der Java-Bytecode noch Informationen, die es gestatten, Sicherheitsroutinen in die Ausführung zu implementieren (z.b. Zugriffsrechte auf Ressourcen). Die Java-VM ist ein virtueller Computer, der auf dem jeweiligen Betriebssystem als Prozess läuft und den standardisierten Java-Bytecode ausführen kann. Durch diese Abstraktion können Java-Programme plattformunabhängig ausgeführt werden: Die auf das jeweilige Betriebssystem angepasste Java-VM bietet eine standardisierte Möglichkeit den Bytecode auszuführen, ohne dass die Besonderheiten des Betriebssystems eine Rolle spielen. Damit ist gewährleistet, dass ein Java- Programm, sofern die JVM korrekt arbeitet, auf allen Rechnerarchitekturen und allen Betriebssystemen gleichermaßen läuft und sich auch identisch verhält. Dies ist insbesondere in der Web-Entwicklung wichtig, da jeder Teilnehmer des Internets, unabhängig von Computer und Betriebsystem, gleichermaßen auf die Inhalte einer Seite zugreifen können soll. Ein weiterer Aspekt ist die Sicherheit. Da Java-Programme in der virtuellen Umgebung laufen, haben sie keinen direkten Zugriff auf das bestehende Betriebssystem. Dies stellt eine Hürde für Viren und Java-Script basierte Angriffe im Internet dar. Im Nachfolgenden Schaubild ist die prinzipielle Abfolge dargestellt: Zuerst wird der Quellcode compiliert und liegt daraufhin als Bytecode vor. Dieser Bytecode wird ein eine Webseite eingebunden und liegt auf dem Server bereit. Dies sind einmalige Vorgänge. Kommt nun ein Nutzer und ruft das Programm auf, so wird der Bytecode in die JVM geladen, interpretiert und ausgeführt. Die JVM übernimmt die Interaktion mit dem Betriebssystem. Diese Vorgänge werden bei jedem Aufruf des Programms erneut durchlaufen. Abbildung 3.1: Prinzipschaubild der Ausführung eines Java-Programms auf einer Webseite 4

9 3.4 Java-Laufzeitsystem Das Java-Laufzeitsystem ist eine Komponente des Interpreters (der Java-VM), welches im Hintergrund verschiedene Dienste zur Verfügung stellt, welche nicht explizit im Quellcode geschrieben werden müssen. Dadurch wird auch ohne besondere Vorsichtsmaßnahmen eine gesicherte Umgebung gewährleistet, welcher dem Programmierer Sicherheit gibt. So fängt das Laufzeitsystem viele Ausnahmen (Exceptions) ab, die unter C/C++ zu einem Totalabsturz des Prozesses oder gar des Betriebssystems geführt hätten. Beispiele sind hier die Division durch Null, ein Array-Überlauf oder eine Null-Pointer-Exception. Der Quellcode: public class ArrayUeberlauf public static void main(string[] args) int[] array = new int[2]; array[5] = 23; Produziert eine Fehlermeldung des Laufzeitsystems: Exception in thread "main" java.lang.arrayindexoutofboundsexception: 5 at ArrayUeberlauf.main(ArrayUeberlauf.java:6) Dies ist auch selbstverständlich, denn es wird dem Array array am Index 5 ein Wert zugewiesen, obwohl array nur 2 Elemente hat. Sobald das Laufzeitsystem einen Fehler abgefangen hat, wird die weitere Ausführung des Programms abgebrochen. Eine weitere wichtige Funktion des Laufzeitsystems ist die Speicherbereinigung. Auf diese wird in einem späteren Kapitel genauer eingegangen. 3.5 Einsatz von Java-Programmen Die weiteste Verbreitung hat Java im Internet als Java-Applets und Java-Serverlets. Dies macht Java zu einer wichtigen Programmiersprache in der heutigen Welt des Internets. Es gibt auch verschiedene Anwendersoftware, die auf Java-Basis geschrieben wurde, Matlab z.b. Nicht eingesetzt wird Java in hardwarenaher Umgebung, sowie bei zeitkritischen Anwendungen. Insbesondere bei schnellen Echtzeitanwendungen kommt es durch die Garbage-Collection unter Umständen zu Verzögerungen und damit zu Fehlern. 3.6 Was braucht man zum Arbeiten mit Java? Sun Microsystems stellt die Java Virtual Machine (JVM) und das Java Runtime Environment (JRE) für die Ausführung von Programmen und das Java Development Kit (JDK) als Entwicklungsumgebung zur Verfügung. Zum eigentlichen Programmieren benötigt man lediglich einen Texteditor, in dem man den Quelltext schreiben kann. Mittels diesem erstellt man eine Datei namens MeineKlasse.java. Dieser Quelltext muss nun natürlich compiliert, also in Bytecode übersetzt, werden. Dafür wird unter Linux das Konsolenkommando javac MeineKlasse.java verwandt. Dieses erzeugt eine Datei MeineKlasse.class. Mittels java MeineKlasse.java kann dieses Programm nun ausgeführt werden. Texteditoren beinhalten allerdings lediglich die grundsätzlichen Textbearbeitungsfunktionen. Auch wenn es viele gibt, die gewisse Funktionen für das Programmieren unterstützen (z.b. VIM, Kate), gibt es doch deutlich komfortablere Lösungen: Das so genannte Integrated Development Environment (IDE). In diesen IDEs wird eine Vielzahl von Einzelfunktionen vereint. So besitzen sie in der Regel zumindest einen Texteditor, Compiler bzw. Interpreter, Debugger, Linker und eine Quelltextformatierungsfunktion. Fortschrittlichere IDEs haben wesentlich mehr Funktionen und automatische Korrekturmechanismen. Das bekannteste und am weitesten verbreitete IDE für Java ist Eclipse. In dieser Veranstaltung wird eine sehr stark minimierte IDE, BlueJ, verwandt. Dieser fehlen, verglichen mit Eclipse, die meisten Möglichkeiten und Mechanismen. Ein aus Allgemeine Informatik I bekanntes IDE ist KarelJ. Ein weiterer wichtiger Punkt ist das Application Programming Interface (API), die Schnittstellenbeschreibung, von Sun Microsystems. In dieser stehen sämtliche Informationen zu den zur Verfügung stehenden Klassen. 5

10 4 Einführung in BlueJ Dieses Kapitel wird verglichen mit der Vorlesung stark gekürzt werden, da die Bedienungsanleitung für die IDE bereits in den Hilfe-Dateien zu finden ist. BlueJ ist eine reine Lern-IDE, daher fehlen ihr viele Funktionen, die das Arbeiten im praktischen Alltag beschleunigen. Beispielsweise verfügt BlueJ über keine Autovervollständigung. Der Sinn dahinter ist, dass man mit dieser IDE alle Handgriffe erlernen soll, auch wenn sie einem später von den IDEs abgenommen werden. Eine Besonderheit von BlueJ ist die Pseudo-UML-Darstellung im Hauptfenster. Hier wird das Programm in Form von Kästen für jede Klasse und jedes Paket dargestellt. Abhängigkeiten untereinander werden durch Pfeile symbolisiert. Objekte werden ebenfalls in dem Hauptfenster grafisch dargestellt. Eine weitere Besonderheit ist, dass BlueJ kein fertiges Java-Programm benötigt, sondern einzelne Methoden ad hoc mit vorgegebenen Werten ausführen kann. Dies erleichtert das Testen von einzelnen Methoden erheblich. Für erweiterte Tests müssen aber ohnehin Testklassen geschrieben werden und mit diesen ist dieser Vorteil hinfällig. Wie Methoden können auch Objekte direkt angesprochen und betrachtet werden (Option: Inspect ). BlueJ verfügt über einen internen Texteditor mit Syntax-Highlighting. Ein großer Nachteil von BlueJ ist, dass diese UML-Darstellung in eigenen Konfigurationsdateien gespeichert wird und so ein Import von Programmen aus anderen IDEs (z.b. Eclipse) unter Umständen problematisch ist. Ein Import von BlueJ-Quelltext in Eclipse ist aber problemlos möglich. Abschließend lässt sich sagen, dass BlueJ zwar für das Handwerkliche (Einrücken, Schreibweisen etc.) eine gute Lern-Umgebung ist, zum echten Programmieren aber nur bedingt hilfreich. Abbildung 4.1: BlueJ Hauptfenster 6

11 5 Wichtige Regeln für die Programmierung in Java In diesem Kapitel werden die wichtigsten und grundlegensten Regeln beim Programmieren mit Java beschrieben. Allen, die Allgemeine Informatik I besucht haben, sollten diese bereits bekannt sein. 5.1 Sprachaufbau Der sprachliche Aufbau von Java unterteilt sich in 5 Abstraktionsebenen: 1. Lexikalische Ebene 2. Syntaktische Ebene 3. Semantische Ebene 4. Logische Ebene 5. Spezifikatorische Ebene Lexikalische Ebene Die lexikalische Ebene stellt die unterste Ebene dar. Auf dieser Ebene befinden sich die grundlegenden Anweisungen und Operatoren. Diese werden zu primitiven Anweisungen, wie int ii = 1; zusammengefügt. Zu den lexikalischen Elementen gehören: Schlüsselwörter, wie int, if, for etc. Bezeichner, also Namen von Klassen, Variablen, Methoden etc. (Diese dürfen nicht mit einer Ziffer beginnen) Operatoren der Grundrechenarten (+,-,*,/) Vergleichsoperatoren (<,>,==,<=) Logische Operatoren (&&, ) Klammern (), [], Literale (explizite Werte), z.b. 23, 42, 1234, a, "Hallo" Seperatoren, wie Tab, Leerzeichen, Zeilenumbruch Syntaktische Ebene Die syntaktische Ebene ist die korrekte Gruppierung von lexikalischen Elementen und damit die Erzeugung von Ausdrücken. Zu beachten ist hier die korrekte Benutzung von Klammern (die Öffnende steht vor der Schließenden). void zahl(int num) int zahl = num; if(zahl < 10) zahl++; In diesem Beispiel sind die Lexikalischen Elemente zahl++; (Addition von 1) und int zahl = num; (Zuweiseung der übergebenen Variable num) durch eine If-Abfrage if(zahl < 10)... getrennt und damit zu einem Ausdruck mit zwei Anweisungen gruppiert. Zu beachten sind auch die Strukturen der geschweiften Klammern. Ein Paar umfasst die komplette Methode und definiert so deren Anfangs- und Endpunkt, ein weiteres Paar definiert den Anfangs- und Endpunkt der If-Abfrage. 7

12 5.1.3 Semantische Ebene Unter der semantischen Ebene versteht man die Prioritätsverteilung zwischen einzelnen syntaktisch korrekt angeordneten lexikalischen Elementen. Ein einfacher Satz der Semantik ist beispielsweise Punkt- vor Strichrechnung. int ii = 4*2 + 6; ergibt ii == 14; int ii = 4*(2 + 6); ergibt hingegen ii == 32; Durch die Klammern wurde die Reihenfolge der Berechnung verändert und damit auch das Ergebnis Logische Ebene Mit der logischen Ebene verlässt man den Bereich, in dem Fehler durch den Compiler entdeckt werden können. Logisch fehlerhafte Programme werden anstandslos compiliert, liefern aber falsche Ergebnisse. Die Suche nach logischen Fehlern kann beliebig aufwändig werden und ist nur durch unentwegtes Testen zu bewerkstelligen. Ein in der Vorlesung angesprochenes Beispiel ist das Fencepost Syndrom : 20 Meter Zaun und alle 2 Meter ein Pfosten. Es scheint offensichtlich, dass sich die Anzahl an Pfosten durch 20 2 = 10 errechnet. Vergegenwärtigt man sich allerdings die Platzierung der Pfosten wird einem schnell folgendes auffallen: P(f osten)[1] 0M eter, P[2] 2m, P[3] 4m,..., P[10] 18m An dieser Stelle wird klar, die Anzahl der Pfosten muss 11 sein. Der vorherige Algorithmus war falsch. Die meisten Programmierfehler finden auf der logischen Ebene statt. In vielen Fällen handelt es sich dabei aber streng genommen nicht um Programmierfehler, sondern um Fehler in verwendeten Algorithmen. Ein weiteres Beispiel stammt aus der Übung 8: public static int mult(int a,int b) if(b > 0) a = a + a; b--; mult(a,b); return a; Hierbei handelt es sich um einen rekursiv ausgeführten Algorithmus, welcher zwei Zahlen multiplizieren soll. Das Prinzip ist folgendes: Solange der Multiplikator b größer Null ist, wird a um a erhöht und der Multiplikator um eins erniedrigt. Dies findet b-mal statt, wäre also eine Multiplikation. Leider ergibt diese Multiplikation vollkommen falsche Ergebnisse. Der Grund dafür liegt daran, dass a bei jeder Rekursion bereits um a erhöht wurde, das heißt wir erhalten die Folge: a 2a 4a 8a... also f b (a) = 2 b a. Umgehen lässt sich dieses Problem lediglich, in dem wir zwei Methoden schreiben. Eine, die zwei Variablen erwartet und als Return dann eine Methode mult(a,b,a); aufruft. Die dritte Variable wird in der Rekursion einfach durch gereicht und die Addition wird als a = a + c; ausgeführt. Dadurch erhalten wir die Folge a 2a 3a 4a... also die gewünschte f b (a) = ba Spezifikatorische Ebene Die spezifikatorische Ebene beschreibt die Diskrepanz zwischen der Intention des Programms und den tatsächlichen Spezifikationen. Ein Beispiel für dieses Problem ist der Millenium-Bug. Jahrzehntelang wurde, um Speicher zu sparen, ein Datum in folgender Form angegeben DD.MM.JJ. Der entspricht also dem 23. Februar Mit dem war diese Spezifikation ungültig, denn es konnte nicht mehr zwischen 1900 und 2000 differenziert werden. Prinzipiell werden die Spezifikationen zu jedem erdenklichen Produkt angegeben. Bei einem Müsli ist es die Nährwerttabelle und die Zutatenliste, bei einem Fernseher die technischen Daten. 8

13 5.2 Einige Grundregeln für das Programmieren in Java Es gibt einige Konventionen, die das Programmieren und vor allem das Lesen von geschriebenem Quellcode erleichtern sollen. An dieser Stelle weicht die Vorlesung an einigen Stellen von den Ansichten des Autors ab. Der erste Punkt dieser Konvention betrifft die Nutzung von Zeilenumbrüchen, Leerstellen und Tabs. Für den eigentlichen Quellcode ist nur ein absolutes Minimum an Leerstellen nötig und keine Tabs oder Zeilenumbrüche. Der hier dargelegte Code würde von einem Compiler anstandslos übersetzt werden: public class Syntaktikervoid zahl()int zahl=5;if(zahl<10)zahl++;else zahl--; Wie unschwer zu erkennen ist, handelt es sich um das Beispiel aus Kapitel Verglichen mit dem dort abgedruckten Code ist dieser hier natürlich deutlich schwerer zu verstehen. Die Funktionalität wäre allerdings nicht eingeschränkt. Die in der Vorlesung vorgeschlagene Konvention sieht folgendes vor: Nach einem Semikolon folgt immer ein Zeilenumbruch, die öffnende geschweifte Klammer befindet sich am ende der Zeile und die nachfolgenden werden um ein Tab (oder einige Leerstellen) eingerückt. Schließende Klammern befinden sich allein stehend in einer Zeile. Diese Konvention erhöht die Lesbarkeit massiv, aber insbesondere bei verschachtelten Schleifenkonstruktionen verliert man schnell den Überblick wo, welche Schleife auf geht und geschlossen wird. Ein Beispiel für diese Problematik: static void schleife() int a = 5; boolean z; while(false) schleife(); if(true) schleife(); Insbesondere im ersten Teil ist nicht sofort ersichtlich, wo sich die öffnenden Klammern befinden. Die vom Autor favorisierte Konvention sieht vor, dass jede geschweifte Klammer nach einem Zeilenumbruch allein steht. Obriger Code sähe dann wie folgt aus: static void schleife() int a = 5; boolean z; while(false) schleife(); if(true) schleife(); Zweifelsohne wird der Code dadurch um einiges länger, aber die Schleifen Anfangs- und Endpunkte sind auf den ersten Blick direkt ersichtlich. Die nächste Konvention betrifft die Namensgebung innerhalb des Quellcodes. Grundsätzlich zu beachten gilt, dass Java zwischen Groß und Kleinbuchstaben unterscheidet. Gibt man beispielsweise int Int; ein, so wird die Interger-Variable Int deklariert, int int; hingegen gibt einen Fehler aus. Auch für Bezeichner gibt es einige Regeln. Wortanfänge werden auch innerhalb eines Wortes groß geschrieben MeineTolleNuklearoptimaleKlasse, der Underscore ist zu vermeiden. Namen von Klassen beginnen immer mit einem Großbuchstaben, Namen von Variablen und Methoden hingegen immer mit Kleinbuchstaben: int var;, Object.methode();. Eine weitere Regel für Bezeichner ist es, sprechende Namen zu benutzen, gettime ist beispielsweise eine Methode die eine Zeit abfragt. Variablen sollten auch Namen erhalten, die über ihre Funktion etwas aussagen, also nicht einfach a, b, c, sondern count, timer, pages. Zähler in Schleifen werden in der Vorlesung üblicherweise mit i bezeichnet. Empfehlenswert ist eher ii oder jj. Wer den Sinn darin nicht erkennen kann, der möge mit der Volltextsuche (Strg + f) ein beliebiges längeres Programm nach i durchsuchen. 9

14 Ein letzter aber nicht weniger wichtiger Punkt ist die Kommentierung. Java bietet das so genannte JavaDoc an, welches automatisch eine Dokumentation im Stile der Java-API (Siehe Kapitel 3.6) erzeugen kann. Näheres unter: Unter Java werden Kommentare mit // gekennzeichnet, mehrzeilige Kommentare sind auch möglich Code //Kommentar /* * Kommentar * Kommentar */ Code Wenn diese einfachen Konventionen beachtet werden, sind die meisten Programme schon hinreichend lesbar: /** * Martin * */ public class Schleifentest /** * Rekursive Schleife, die zum Absturz des Laufzeitsystems führt. a - Nutzloser Integer-Wert */ static void schleife(int a) if(true) //true: Wird immer ausgeführt. schleife(a); //Rekursiver Aufruf! /* * Main-Methode: * Ruft Schleife mit dem Integer 1 auf, wenn args leer ist. */ public static void main(string[] args) if(args.length < 1) schleife(1); In diesem Beispiel kommt sowohl konventionelle Kommentierung, als auch Javadoc zur Anwendung. 10

15 6 Datentypen Bei Datentypen wird zwischen zwei Haupttypen unterschieden. Einerseits die eingebauten, primitiven Datentypen, wie int, char, double, die Grundlegende Basis eines Java-Programms. Mit ihnen werden sämtliche konkreten Datenveränderungen durchgeführt. Andererseits zusammen gesetzte Datentypen (Klassen). In ihnen können mehrere primitive Datentypen zusammengefasst und verwandt werden. Diese sind im Übertragenen Sinne als Bausteie zu sehen, mit welchen komplexere Programme aufgebaut werden können, ohne dass eine gewisse Funktion explizit immer wieder geschrieben werden muss. Dadurch ist es in vielen Fällen nicht nötig, selbst zu entwickeln, sondern es kann auf Bestehendes zurück gegriffen werden. Ein weiterer Vorteil ist, dass bestimmte Bereiche für sich eingekapselt, also abgeschlossen sind. Das bewirkt, dass ein Entwickler auch ohne eine genaue Kenntnis eines gewissen Detailgebietes auf vorgefertigte Funktionen zurückgreifen kann. 6.1 Eingebaute Datentypen Zu erst eine Übersicht über die eingebauten Datentypen und ihre Eigenschaften: Typ Länge Wertebereich Standardwert in Byte boolean 1 True, False False char 2 Alle Unicode-Zeichen \u0000 byte short int long float 4 ±3, double 8 ±1, long double 10 ±1, Tabelle 6.1: eingebaute Datentypen In den meisten Anwendungen spielen lediglich boolean, char, int, double eine Rolle. Die anderen Variablentypen sind heutzutage nur noch bei sehr speicherkritischen Anwendungen von Belang Datentyp char Der eingebaute Datentyp char wird benutzt, um Zeichen zu speichern. In vielen Programmiersprachen werden ASCII- Zeichen gespeichert, in Java hingegen Unicode, daher ist ein char in Java 2 Byte (statt einem Byte) lang. Unicode-Zeichen werden in der Form \uxxxx gespeichert, wobei x jeweils für einen hexadezimalen Wert steht. char-literale werden in einfache Hochkommata gesetzt, z.b. A, z, Datentypen float und double Bei float und double handelt es sich um Fließkommawerte, das heißt, sie werden in der Form x, x x x y gespeichert. Der Hauptunterschied zwischen diesen beiden Datentypen besteht in ihrer Größe und damit ihrem Wertebereich. float (=Floating-Point-Numbers) ist 4 Byte, also 32 Bit, lang. Davon werden 23 für die Mantisse, 8 für den Exponent und eines für das Vorzeichen verwendet. Das ergibt, wie auch der Tabelle zu entnehmen ist, einen Wertebereich von ±3, float war ursprünglich (in anderen Programmiersprachen) als kompakter Datentyp für reelle Zahlen gedacht. double (=double precision) verwendet die doppelte Anzahl an Bits, 64, um reelle Zahlen zu speichern. Diese teilen sich wie folgt auf: 53 Bit für die Mantisse, 10 für den Exponent und eines für das Vorzeichen. So wird ein Wertebereich von ±1, abgedeckt. Da man heutzutage in den meisten Anwendungen keinerlei Speicherprobleme mehr zu befürchten hat, wird gewöhnlicher Weise nur noch double verwendet. 11

16 6.1.3 Der Standardwert Wird ein Objekt eines eingebauten Datentyps bei seiner Einrichtung nicht explizit mit einem Wert initialisiert, so wird es automatisch mit dem dazugehörigen Standardwert initialisiert. Dies bedeutet, dass Folgende Deklarationen prinzipiell äquivalent sind: int ii; int jj = 0; Für numerische Datentypen (int, float, double etc.) ist der Standardwert immer Null, für char ist er das Nichtzeichen (Unicode-Wert 0) und für boolsche Datentypen false. Da alle Werte quasi Null sind, false sieht man auch als Null an, werden diese Standardwerte auch als Nullwerte bezeichnet. In neuen Versionen des Java-Compilers wird trotz dieser Tatsache eine explizite Initialisierung lokaler Datentypen gefordert. Dies wurde von den Compiler-Entwicklern eingeführt um im Quellcode einen konsistenten Stil zu erzwingen. Das bedeutet, dass der Compiler einen Fehler wegen fehlender Initialisierung ausgibt, obwohl die Datentypen prinzipiell bereits einen Standardwert besitzen. Betrachtet man beispielsweise dieses Beispiel einer lokalen Integer-Variable: int ii; ii++; So wird man bei der zweiten Zeile eine Fehlermeldung erhalten. Zwar besitzt ii prinzipiell bereits den Standardwert 0, dieser wird aber nicht anerkannt. Dies hingegen funktioniert fehlerlos. jj nimmt in diesem Fall den Wert 1 an: int jj = 0; jj++; Oder alternativ: int jj; jj = 0; jj++; Wie bereits gesagt, gilt dies aber nur für lokale Variablen. So ergibt eine als Klassenvariable deklarierte Integer-Variable (static int ii;) trotz fehlender expliziter Initialisierung keine Fehlermeldung. 12

17 6.2 Operatoren Ein Operator ist ein Lexikalisches Element, welches der Steuerung von Befehlsfolgen dient. Grundsätzlich wird zwischen folgenden Arten von Operatoren unterschieden: Relationale Operatoren, Arithmetische Operatoren, Logische Operatoren, Short Circuit Operatoren, sowie Zuweisungsoperatoren Relationale Operatoren Relationale Operatoren dienen dem Vergleich von numerischen Werten auf boolscher Ebene, das heißt sie geben lediglich ein true oder false zurück. Releationale Operatoren sind: Operator Bezeichnung Bedeutung == Gleich a == b ergibt true, wenn a gleich b!= Ungleich a!= b ergibt true, wenn a ungleich b < Kleiner a < b ergibt true, wenn a kleiner b <= Kleiner-Gleich a <= b ergibt true, wenn a kleiner oder gleich b > Größer a > b ergibt true, wenn a größer b >= Größer-Gleich a >= b ergibt true, wenn a größer oder gleich b Tabelle 6.2: Relationale Operatoren Arithmetische Operatoren Arithmetische Operatoren erwarten Numerische werte und liefern ebenfalls numerische Werte zurück. Bei diesen Operatoren handelt es sich überwiegend um die mathematischen Grundrechenarten. Werden verschiedene numerische Datentypen mit einem arithmetischen Operator verknüpft, so wird das Ergebnis in Form des größeren der beiden Datentypen zurück gegeben. So wird int Int; double Double; public void calc() System.out.print(this.Int + this.double); immer einen double-wert ausgeben, obwohl einer der Operanden vom Datentyp her ein int ist. Dies bedeutet, es wird bei arithmetischen Operatoren immer automatisch ein Type-Cast (=Konvertierung) zum größten verwendeten Datentyp durchgeführt. Neben den Grundrechenarten der arithmetischen Operatoren gibt es noch eine Vielzahl weiterer mathematischer Methoden in Java, diese können über java.lang.math.befehl(...) aufgerufen werden. Math.sqrt(...) errechnet beispielsweise die Quadratwurzel (Squareroot). Es gibt zwei Datentypen, die einer Ausnahme bedürfen. Der erste ist der komplexe Datentyp String. Man kann zwei Strings addieren, das ist äquivalent des Anhängens des einen an den anderen: public class StringAdder public static void main(string[] args) String str1 = "Hallo"; String str2 = " Welt"; String str3 = str1 + str2; System.out.println(str3); 13

18 Dies ergibt als Ausgabe: Hallo Welt Der zweite Sonderfall ist char. Werte des Datentyps char können addiert und subtrahiert werden. Dabei werden diese automatisch (also implizit) in einen Integer-Wert konvertiert. Um das Ergebnis wieder als char darstellen zu können ist ein expliziter Type-Cast erforderlich. char a = f ; char b = (char)(a - a + A ); In diesem Beispiel wird von f der Wert von a abgezogen und der von A addiert, eine Verschiebung dieses Offsets ergibt F. Operator Bezeichnung Bedeutung + Pos. Vorzeichen +n ist gleich n - Neg. Vorzeichen -n kehrt Vorzeichen von n um + Summe a + b ergibt die Summe a + b - Differenz a - b ergibt die Differenz a - b * Produkt a * b ergibt das Produkt a * b / Quotient a / b ergibt den Quotionten a b % Restwert a % b ergibt den restwert der Ganzzahligen Division von a durch b. ++ a+1 a++ == a+1, Präinkrement und Postinkrement beachten! -- a-1 a-- == a-1, Prädekrement und Postdekrement beachten! Tabelle 6.3: Arithmetische Operatoren Beispiel für Prä- und Postinkrement: int a = 1; int b = a++; //b == 1, a == 2 Das bedeutet, die Addition von 1 erfolgt nach der Zuweisung. int a = 1; int b = ++a; //b == 2, a == 2 Beim Präinkrement wird zuerst die Addition a+1 ausgeführt und das Ergebnis anschließend b zugewiesen Logische Operatoren/Short-Circuit Operator Bezeichnung Bedeutung! logisches Nicht Invertiert den boolschen Wert && Und mit Short-Circuit a && b ergibt true, wenn a und b zutreffen. Ist a bereits falsch, wird b nicht ausgewertet. Oder mit Short-Circuit a b ergibt true, wenn entweder a oder b zutrifft. Trifft a bereits zu, wird b nicht mehr ausgewertet. & Und ohne Short-Circuit Ergibt true, wenn a und b zutreffen. Beide Teilausdrücke werden ausgewertet Oder ohne Short-Circuit Ergibt true, wenn entweder a oder b zutrifft. Beide Teilausdrücke werden ausgewertet ^ Exor Ergibt true, wenn a und b einen unterschiedlichen Wahrheitswert haben. Wird bitweise Ausgewertet. Tabelle 6.4: Logische Operatoren/Short-Circuit 14

19 Weitergehend gilt es zu beachten, dass eine Auswertung auch Bit-weise erfolgen kann, und so deutlich andere Ergebnisse liefert: int ii; ii = 1 2 //ii == 3 Der Grund hierfür liegt auf der binären Ebene. Die Operation 1 2 lässt sich auch schreiben als 01 10, denn binär betrachtet is 1 == 01 und 2 == 10, das Ergebnis der bitweisen Oder-Verknüpfung ist nun 11 und damit im dezimalen System Zuweisungsoperatoren Zweisungen werden immer mit einem einfachen Gleichheitszeichen gekennzeichnet. Die Zuweisung ii = jj weist ii den Wert von jj zu. Zusätzlich kann die zuweisung noch mit einem Operator versehen werden. So weist ii ^= jj ii den Wert ii jj (ii Exor jj) zu. Rückgabewert ist immer der jeweils zugewiesene Wert. In diesen Beispielen kann jj ein beliebiger Wert sein, dessen Datentyp lediglich zu ii muss. 6.3 Type-Cast Unter einem Type-Cast versteht man eine Konvertierung zwischen zwei Datentypen. Bei einer Berechnung mit unterschiedlichen numerischen Datentypen, wird ein automatischer Type-Cast auf den größten verwendeten Datentypen ausgeführt. Werte vom Typ char werden ebenfalls Automatisch Konvertiert, da sie als Unicode-Zeichen einen eindeutigen Zahlenwert (vom Typ int) repräsentieren. Anzumerken ist, dass der Type-Cast von int zu float eine gewisse Unsicherheit birgt. Dies ist durch den Begrenzten Speicherplatz der Mantisse bedingt. Während int eine ganze Zahl mit 32Bit darstellt hat float lediglich 23 Bit für die Mantisse vorgesehen. Das bedeutet, dass es bei sehr großen Integer-Werten zu einer gewissen Veränderung bei der Konvertierung kommt. Trotzdem wird dieser Vorgang als sicher betrachtet und ein Type-Cast implizit ausgeführt Ein anderer Fall ist der explizite Type-Cast. Hier wird von einem Datentyp zu einem anderen Konvertiert, der nicht jeden Wert darstellen kann, z.b. von double nach int. Die Syntax des expliziten Typ-Casts sieht wie folgt aus: int ii = z ; //impliziter Type-Cast von char nach int char chr = (char)(ii-1); //expliziter Type-Cast von int nach char //chr == y Auch Literale haben einen Standardtyp, so muss bei der Eingabe ggf. ein Type-Cast ausgeführt werden. Zeichen haben immer den Typ char, ganzzahlige Literale den Typ int und nicht-ganzzahlige Literale den Typ double. Will man nun ein Literal direkt zuweisen und es kann kein impliziter Type-Cast ausgeführt werden, so muss ein expliziter Type-Cast durchgeführt werden: float ii = 23.42; Ergibt eine Fehlermeldung, da ein impliziter Type-Cast von double nach float nicht möglich ist. Richtig würde der code lauten: float ii = (float) 23.42; 6.4 Ausdrücke Ein Ausdruck besteht prinzipiell aus einem Rückgabetyp, einem Rückgabewert und ggf. Seiteneffekten. Beispiel: float ii = 23+42; Bei diesem Beispiel ist der Rückgabetyp int, der Rückgabewert 65 und der Nebeneffekt ein impliziter Type-Cast von int nach float. 15

20 6.5 Klassen und Objekte Neben den eingebauten Datentypen gibt es weitergehend noch Klassen, welche ebenfalls einen Datentyp repräsentieren. Klassen und Objekte bilden den Grundstock einer jeden objektorientierten Programmierung und damit auch von Java. Dies steht im Gegensatz zur prodezualen Programmierung, bei der die Grundstruktur aus einzelnen Prozessen besteht. Die Definition einer Klasse ist eine Beschreibung gemeinsamen Verhaltens, sowie gemeinsamer Struktur von Objekten. Die Datenstrukturen der Klassen sind in sich geschlossen, Zugriffe sind nur über so gennante get- bzw. set-methoden gestattet. Durch diese Schnittstellen ist gewährleistet, dass unvorhersehbares Verhalten des Objekts durch einen direkten Zugriff auf interne Daten nicht auftreten kann. Klassen ermöglichen eine Entwicklung auf einer Abstraktionsebene, welche unabhängig von den realen Ausprägungen des Objekts sind. Dies bedeutet beispielsweise, dass man mit der Klasse Hausnummer arbeiten kann, unabhängig davon, ob diese nun den Wert 53 oder 324 repräsentiert. Die Klasse String speichert unveränderliche Zeichenketten und stellt diverse Methoden zur Inspektion, Konvertierung und Bearbeitung zur Verfügung. Im Gegensatz zu char, ein Datentyp für einzelne Literale, handelt es sich bei String nicht um einen eingebauten Datentyp. Dies ist bereits am Namen zu erkennen, da String mit einem Großbuchstaben geschrieben wird. Die Deklaration eines Strings kann auf zwei Wege erfolgen: oder String str = new String ("Dies ist der Text"); String str = "Dies ist ein Text"; Ein String kann auch nicht-druckbare Zeichen enthalten, für diese gibt es besondere Befehlcodes: Zeichen Bedeutung \t Tabulator \n Zeilenumbruch (newline) \f Seitenumbruch (formfeed) \ Anführungszeichen \ Hochkomma \\ Backslash Tabelle 6.5: Zeichencodes Es gibt verschiedene Methoden der Klasse String, um Eigenschaften abzufragen, diese nun aufzuzählen ist nicht sinnvoll, sie sind im Anhang oder in der Java-API zu finden. Grundsätzlich lassen sich Klassen in zwei Bestandteile aufteilen, einmal den äußeren und einmal den inneren Teil. Der äußere Teil legt die Bennenung der Klasse fest, sowie ggf. die Vererbungen: public class Klasse extends UrKlasse //Hier steht der innere Teil Vererbungen werden in einem späteren Kapitel behandelt. Im inneren Teil einer Klasse befinden sich die Definitionen der Datenfelder, Konstruktoren und Methoden, die den jeweiligen Instanzen oder Objekten ihre Struktur oder ihr spezifisches Verhalten geben. In Java ist die Reihenfolde innerhalb des inneren Teils nicht festgelegt, es hat sich mit der Zeit aber folgende Konvention herausgebildet: 1. Datenfelder 2. Konstruktoren 3. Methoden 16

21 6.5.1 Datenfelder Die Datenfelder einer Klasse werden häufig auch als Klassenattribute oder Instanzvariablen bezeichnet. Datenfelder werden benötigt um innerhalb eines Objekts Daten zu speichern. In Methoden erfolgt der Zugriff auf diese Datenfelder immer mit this.variablennahme. Im Falle von KarelJ aus AI-I waren dies Beispielsweise die Anzahl der Beeper, die Koordinaten des Roboters oder die Blickrichtung. Beispielhafte Deklaration von Klassenattributen: public class Klasse int zahl; char chr; double zahl2; //Hier kommen Konstruktoren und Methoden Konstruktoren Konstruktoren ermöglichen es, ein Objekt nach seiner Erzeugung in einen gültigen Zustand zu versetzen und überdies, direkt bei der Erzeugung des Objektes Code auszuführen. Bei dieser sog. Initialisierung werden Objekte zu einer konkreten Ausprägung einer abstrakten Klasse. Dies bedeutet am Beispiel des Strings erklärt, dass die Deklaration String str = new String ("Dies ist der Text"); einen String initialisiert mit einer konkreten Ausprägung. Der String str bekommt den Inhalt Dies ist der Text zugewiesen. Der unterschied zwischen Objekten und Klassen liegt in der Form der Definition und der Art, wie sie vom Compiler behandelt werden. Klassen werden durch class definiert und vom Compliler übersetzt. Objekte hingegen werden mittels new definiert und innerhalb der Laufzeit angelegt. Für Konstruktoren einer Klasse gibt es bestimmte syntaktische Eigenschaften. So muss der Name des Konstruktors gleich dem der Klasse sein. Desweiteren darf ein Konstruktor keinerlei Angaben über Rückgabetypen enthalten. Eine Methode, welche den gleichen Namen wie die Klasse hat, wird automatisch als Konstruktor dieser Klasse behandelt. Eine Klasse kann auch über mehrere Konstruktoren verfügen, da diese aber zwangsweise über den gleichen Namen verfügen, kann nur mittels Überladung zwischen ihnen unterschieden werden. Ein Konstruktor einer Klasse wird mit new in einer spezifischen Situation aufgerufen. Hinter dem new folgt der Name der Klasse, oder aus anderer Sicht, der Name des Konstruktors. In der folgenden Klammer sind die für den jeweiligen Konstruktor erforderlichen Parameter angegeben. Ein anschauliches Beispiel ist die Klasse String. Diese kann sowohl als Objekt als auch als Klasse Initialisiert werden. Dies erklärt die beiden parallelen Möglichkeiten einen String zu erzeugen, welche zu Beginn dieses Kapitels vorgestellt wurden. Im folgenden ein Beispiel für einen Konstruktor, einschlißlch des Aufrufs in der Main-Methode. public class Klasse int zahl; //Klassenattribut Klasse(int a) //Konstruktor this.zahl = a; //Übergabe an das Klassenattribut System.out.println("Klasse erzeugt!"); //Hier folgen Methoden. public static void main(string[] args) Klasse name = new Klasse(23); //Aufruf des Konstruktors mit dem Parameter 23 vom Typ int 17

22 6.5.3 Methoden Der letzte Teil einer Klasse sind die Methoden. Diese ermöglichen es, den Zustand der Datenfelder einer Klasse zu verändern (auf diese darf nicht direkt zugegriffen werden!), oder ein bestimmtes Verhalten der Klasse zu bedingen. Methoden bestehen aus einem Kopf und einem Rumpf, dies ist äquivalent zum inneren bzw. äußeren Teil einer Klasse. Im Methodenkopf befindet sich ein Kommentar über die Funktionen der Methode und die Signatur der Methode. Im Rumpf der Methode stehen die Deklarationen und Anweisungen. Diese legen fest, welches Verhalten die Methode beim Aufruf an den Tag legt. Die Methodensignatur enthält den Rückgabe- bzw. Ereignistyp, den vollständigen Namen der Methode, sowie die Namen und Typen der bei Aufruf zu übergebenden Parameter. Der Unterschied zwischen der Signatur einer Methode und dem eines Konstruktors besteht darin, dass eine Methode einen Rückgabetyp enthält. In diesem Beispiel sollen verschiedene Arten von Methoden erläutert werden: public class Klasse int zahl; //Klassenattribut //Hier wäre der Konstruktor //Methode zur veränderung des Klassenattributs public void zahlhoch(int zaeler) this.zahl = this.zahl + zaeler; //Methode zum Auslesen des Klassenattributs public int getzahl() return this.zahl; //Methode mit lokaler Variable public int addzahl(int adder) int add = this.zahl + adder; return add; 6.6 Variablen in Klassen Im Vergangenen Kapitel wurden bereits verschiedene Arten von Variablen eingesetzt. Einerseits Datenfelder, welche außerhalb von Konstruktoren und Methoden erzeugt werden und so von der gesamten Klasse aus eingesehen werden können. Andererseits noch formale Parameter, die im Kopf eines Konstruktors oder einer Methode angegeben sind. Diese sind lediglich für die jeweilige Methode einsehbar, ihre werte erhalten sie aber von Außen. Schließlich noch die lokalen Variablen, welche innerhalb des Methodenrumpfes deklariert werden. Diese sind nur innerhalb des jeweiligen Blocks einsehbar. Der Begriff Variable allgemein ist in der Informatik deutlich anders definiert als in der Mathematik, in der praktischen Verwendung aber ähnlich. In der Mathematik steht eine Variable für eine Menge von Zahlen, z.b. y = x 2, xεr. Das bedeutet, y ist die Menge der Zahlen für die x 2 zutrifft und x ist ein Element der Menge der reellen Zahlen. Trägt man nun y über x auf, so erhält man eine Normalparabel. In der Informatik hingegen repräsentiert eine Variable einen Zeiger auf eine eindeutig bestimmte Speicheraddresse. Weißt man nun der Variable einen wert zu, so wird dieser an genau dieser Speicheraddresse abgespeichert. Eine Variable in der Informatik ist also nichts anderes als eine Art Wegweiser auf eine Speicheraddresse. 18

23 7 Variablen und deren Gültigkeit Bei den Datenkomponenten einer Klasse wird grundsätzlich zwischen Objekt- und Klassenvariablen bzw. -Konstanten unterschieden. Syntaktisch findet diese Unterscheidung durch ein vorgestelltes static statt. Dieses Schlüsselwort deklariert Klassenkonstanten und -variablen. Semantisch lassen sich Objekt und Klassen dadurch unterschieden, dass Klassenvariablen ein einmaliges Objekt sind. Sie werden in der Klasse selbst gespeichert und nicht in den Objekten. Eine Objektvariable hingegen wird mit jeder Objektinstanz neu erzeugt und ist damit Bestandteil des Objektes. Auf Klassenvariablen und -Objekte kann auch ohne konkretes Objekt zugegriffen werden: Klassenname.klassenvariable. Dies lässt sich auch an einem Beispiel verdeutlichen: public class Klasse public int zahl; //Klassenattribut public static int zahl2; //Klassenvariable Klasse(int ii, int jj) this.zahl = ii; this.zahl2 = jj; public static void main(string[] args) Klasse a = new Klasse(1,2); Klasse b = new Klasse(3,4); System.out.println("a: " + a.zahl + ", " + a.zahl2); System.out.println("b: " + b.zahl + ", " + b.zahl2); Dieses Ergibt die Ausgabe: a: 1, 4 b: 3, 4 Bedenkt man, dass es sich bei zahl2 um eine Klassenvariable handelt, so ist dies wenig verwunderlich. Diese wird bei der Initialisierung des Objekts b auf 4 gesetzt. Hätte es sich dabei um eine Objektvariable gehandelt, so wäre die Ausgabe: a: 1, 2 b: 3, 4 Hier sieht man deutlich den Unterschied zwischen Objekt- und Klassenvariablen. Während eine Objektvariable mit jedem Objekt neu erzeugt wird und nur für dieses und genau dieses gilt, gilt eine Klassenvariable für alle Objekte dieser Klasse gleichermaßen. Das heißt: Ändert man eine Objektvariable so hat dies nur einen Effekt auf das jeweilig zugreifende Objekt. Ändert man eine Klassenvariable, so hat dies einen Effekt auf alle Objekte der Klasse. Bei der Compilierung wird die Speicheraddresse der zwei Variablentypen unterschiedlich berechnet. Bei obrigem Beispiel wird die Speicheraddresse von zahl, dem Klassenattibut, berechnet, in dem die Position von zahl auf die Addrese des jeweiligen Objektes (a oder b) aufaddiert wird. die Addresse von zahl2 hingegen wird eine globale Addresse direkt eingesetzt. Im Compiler wird die Addresse von Klasse.zahl2 intern gespeichert. 19

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

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

1. Java Grundbegriffe

1. Java Grundbegriffe 1. Java Grundbegriffe Geschichte von Java Programmieren mit Java Interpretieren vs. Kompilieren Java Byte-Code Jave Virtual Machine Arbeitsmaterialien Allgemeine Informatik 2 SS09 Folie 1.1 Java, eine

Mehr

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

4. Datentypen. Einleitung Eingebaute Datentypen. Konversion / Type-Cast. Operatoren. Übersicht Die Datentypen char, float und double Standardwerte 4. Datentypen Einleitung Eingebaute Datentypen Übersicht Die Datentypen char, float und double Standardwerte Konversion / Type-Cast Datentyp von Literalen Operatoren Ausdrücke Allgemeine Informatik 2 SS09

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter Die Programmiersprache Java Dr. Wolfgang Süß Thorsten Schlachter Eigenschaften von Java Java ist eine von der Firma Sun Microsystems entwickelte objektorientierte Programmiersprache. Java ist......a simple,

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

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

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3. Hello World Javakurs 2014, 1. Vorlesung Sebastian Schuck basierend auf der Vorlage von Arne Kappen wiki.freitagsrunde.org 3. März 2014 This work is licensed under the Creative Commons Attribution-ShareAlike

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Vorkurs Informatik WiSe 15/16

Vorkurs Informatik WiSe 15/16 Java 1 Dr. Werner Struckmann / Stephan Mielke, Jakob Garbe, 12.10.2015 Technische Universität Braunschweig, IPS Überblick Organisatorisches Arbeitsablauf Hello! 12.10.2015 Dr. Werner Struckmann / Stephan

Mehr

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

Mehr

Computeranwendung und Programmierung (CuP)

Computeranwendung und Programmierung (CuP) Computeranwendung und Programmierung (CuP) VO: Peter Auer (Informationstechnologie) UE: Norbert Seifter (Angewandet Mathematik) Organisatorisches (Vorlesung) Vorlesungszeiten Montag 11:15 12:45 Freitag

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, 17.09.2012 Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, 17.09.2012 Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg. Klausur Informatik Programmierung, 17.09.2012 Seite 1 von 8 Klausurteilnehmer Name: Matrikelnummer: Wichtige Hinweise Es sind keinerlei Hilfsmittel zugelassen auch keine Taschenrechner! Die Klausur dauert

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

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

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

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

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

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

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

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

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik Informatik I WS 2012/13 Tutorium zur Vorlesung 1. Alexander Zietlow zietlow@informatik.uni-tuebingen.de Wilhelm-Schickard-Institut für Informatik Eberhard Karls Universität Tübingen 11.02.2013 1. 2. 1.

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff Programmieren in C Felder, Schleifen und Fließkommaarithmetik Prof. Dr. Nikolaus Wulff Addition von Zahlen 1 2 3 4 5 #include int main() { int x,y,z,sum; x = 1; y = 2; z = 4; sum = x + y + z;

Mehr

C# im Vergleich zu Java

C# im Vergleich zu Java C# im Vergleich zu Java Serhad Ilgün Seminar Universität Dortmund SS 03 Gliederung Entstehung von C# und Java Überblick von C# und Java Unterschiede und Gemeinsamkeiten Zusammenfassung und Ausblick Entstehung

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

3. Grundregeln für die Java-Programmierung

3. Grundregeln für die Java-Programmierung 3. Grundregeln für die Java-Programmierung Sprachaufbau von Java Programmen Stilistische Konventionen JavaDoc Allgemeine Informatik 2 SS09 Folie 2.1 Allgemeine Vorbemerkung Bei Programmiersprachen sind

Mehr

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

Übungsblatt 3: Algorithmen in Java & Grammatiken

Übungsblatt 3: Algorithmen in Java & Grammatiken Humboldt-Universität zu Berlin Grundlagen der Programmierung (Vorlesung von Prof. Bothe) Institut für Informatik WS 15/16 Übungsblatt 3: Algorithmen in Java & Grammatiken Abgabe: bis 9:00 Uhr am 30.11.2015

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

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

Programmiervorkurs. Organisation: Steffen Gebert, Alexander Wolff. Tutoren: Jürgen Zöller, Jonathan Stoll. Wintersemester 2012/2013 Programmiervorkurs Wintersemester 2012/2013 Organisation: Steffen Gebert, Alexander Wolff Tutoren: Jürgen Zöller, Jonathan Stoll Kontakt (für Organisatorisches, Fehler auf Folien...): Steffen Gebert steffen.gebert@informatik.uni-wuerzburg.de

Mehr

Java Einführung Programmcode

Java Einführung Programmcode Java Einführung Programmcode Inhalt dieser Einheit Programmelemente Der erste Programmcode Die Entwicklungsumgebung: Sun's Java Software Development Kit (SDK) Vom Code zum Ausführen des Programms 2 Wiederholung:

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Diana Lange. Generative Gestaltung Operatoren

Diana Lange. Generative Gestaltung Operatoren Diana Lange Generative Gestaltung Operatoren Begriffserklärung Verknüpfungsvorschrift im Rahmen logischer Kalküle. Quelle: google Operatoren sind Zeichen, die mit einer bestimmten Bedeutung versehen sind.

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

J.5 Die Java Virtual Machine

J.5 Die Java Virtual Machine Java Virtual Machine Die Java Virtual Machine 22 Prof. Dr. Rainer Manthey Informatik II Java-Compiler und Java Virtual Machine Quellcode-Datei class C... javac D.java Java-Compiler - Dateien class class

Mehr

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

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7 Java 7 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Dezember 2011 JAV7 5 Java 7 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4. Agenda für heute, 4. Mai, 2006 Programmierparadigmen Imperative Programmiersprachen In Prozeduren zusammengefasste, sequentiell ausgeführte Anweisungen Die Prozeduren werden ausgeführt, wenn sie als Teil

Mehr

Kapitel 05. Datentypen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Kapitel 05. Datentypen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz Kapitel 05 Datentypen Inhalt des 5. Kapitels Datentypen 5.1 Einleitung 5.2 Eingebaute Datentypen Übersicht Die Datentypen char, float und double Standardwerte Operatoren Konversion / Type-Cast Datentyp

Mehr

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

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. Einfache Ein- und Ausgabe mit Java 1. Hallo-Welt! Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. /** Die Klasse hello sendet einen

Mehr

Javakurs zu Informatik I. Henning Heitkötter

Javakurs zu Informatik I. Henning Heitkötter Javakurs zu Informatik I Arrays vergleichen Implementieren Sie folgende Methode, die prüft, ob die Elemente der beiden Arrays an jeder Position übereinstimmen: public static boolean identisch(int[] a,

Mehr

Numerische Datentypen. Simon Weidmann

Numerische Datentypen. Simon Weidmann Numerische Datentypen Simon Weidmann 08.05.2014 1 Ganzzahlige Typen 1.1 Generelles Bei Datentypen muss man immer zwei elementare Eigenschaften unterscheiden: Zuerst gibt es den Wertebereich, zweitens die

Mehr

Computerarithmetik ( )

Computerarithmetik ( ) Anhang A Computerarithmetik ( ) A.1 Zahlendarstellung im Rechner und Computerarithmetik Prinzipiell ist die Menge der im Computer darstellbaren Zahlen endlich. Wie groß diese Menge ist, hängt von der Rechnerarchitektur

Mehr

Einführung in PHP. (mit Aufgaben)

Einführung in PHP. (mit Aufgaben) Einführung in PHP (mit Aufgaben) Dynamische Inhalte mit PHP? 2 Aus der Wikipedia (verkürzt): PHP wird auf etwa 244 Millionen Websites eingesetzt (Stand: Januar 2013) und wird auf etwa 80 % aller Websites

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Einführung in Eclipse und Java

Einführung in Eclipse und Java Universität Bayreuth Lehrstuhl für Angewandte Informatik IV Datenbanken und Informationssysteme Prof. Dr.-Ing. Jablonski Einführung in Eclipse und Java Dipl.Inf. Manuel Götz Lehrstuhl für Angewandte Informatik

Mehr

.NET Code schützen. Projekt.NET. Version 1.0

.NET Code schützen. Projekt.NET. Version 1.0 .NET Code schützen Projekt.NET Informationsmaterial zum Schützen des.net Codes Version 1.0 Autor: Status: Ablage: Empfänger: Seiten: D. Hoyer 1 / 6 Verteiler : Dokument1 Seite 1 von 1 Änderungsprotokoll

Mehr

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

Übungen zu C++ Kapitel 1

Übungen zu C++ Kapitel 1 Übungen zu C++ Kapitel 1 Aufgabe 1 Ergänze den Text. a) Die sechs logischen Einheiten eines Computers sind Eingabe-Einheit, Ausgabe-Einheit, RAM, ALU, CPU, Plattenspeicher. b) Die Programme, welche Hochsprachenprogramme

Mehr

Einführung in Javadoc

Einführung in Javadoc Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:

Mehr

Die Programmiersprache C

Die Programmiersprache C Die Programmiersprache C höhere Programmiersprache (mit einigen Assembler-ähnlichen Konstrukten) gut verständliche Kommandos muss von Compiler in maschinenlesbaren Code (Binärdatei) übersetzt werden universell,

Mehr

Programmieren was ist das genau?

Programmieren was ist das genau? Programmieren was ist das genau? Programmieren heisst Computerprogramme herstellen (von griechisch programma für Vorschrift). Ein Computerprogramm ist Teil der Software eines Computers. Als Software bezeichnet

Mehr

5. Tutorium zu Programmieren

5. Tutorium zu Programmieren 5. Tutorium zu Programmieren Dennis Ewert Gruppe 6 Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by IPD Snelting

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18 Kapitel 3 Datentypen und Variablen Seite 1 von 18 Datentypen - Einführung - Für jede Variable muss ein Datentyp festgelegt werden. - Hierdurch werden die Wertemenge und die verwendbaren Operatoren festgelegt.

Mehr

Tutorium Rechnerorganisation

Tutorium Rechnerorganisation Woche 2 Tutorien 3 und 4 zur Vorlesung Rechnerorganisation 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

Innere Klassen in Java

Innere Klassen in Java Innere Klassen in Java SS 2012 Prof. Dr. Margarita Esponda Innere Klassen Klassen- oder Interfacedefinitionen können zur besseren Strukturierung von Programmen verschachtelt werden Eine "Inner Class" wird

Mehr

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen

Mehr

Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002

Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002 Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002 Prüfungsaufgaben zu den Vorlesungen Datenverarbeitung im ersten und im zweiten Semester Aufgabensteller: Gleißner Die Lösungen sind auf das

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv Roboter programmieren mit NXC für Lego Mindstorms NXT 1. Auflage Roboter programmieren mit NXC für Lego Mindstorms NXT schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv Verlag

Mehr

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java Klausur zur Einführung in die objektorientierte Programmierung mit Java im Studiengang Informationswissenschaft Prof. Dr. Christian Wolff Professur für Medieninformatik Institut für Medien-, Informations-

Mehr

Applications Applets (eingeschränkte Rechte)

Applications Applets (eingeschränkte Rechte) 1 Arten von Java-Programmen Man unterscheidet 2 verschiedene Arten von Java-Programmen: Applications Applets (eingeschränkte Rechte) Erstere sind eigenständige Programme. Letztere sind "kleine" Programme,

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 15: Reguläre Ausdrücke und rechtslineare Grammatiken Thomas Worsch Universität Karlsruhe, Fakultät für Informatik Wintersemester 2008/2009 1/25 Was kann man mit endlichen

Mehr

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007 Fachhochschule Bonn-Rhein-Sieg University of Applied Sciences Fachbereich Informatik Prof. Dr. Peter Becker Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Mehr

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15 Übersicht Schleifen Schleifeninvarianten Referenztypen, Wrapperklassen und API CoMa I WS 08/09 1/15 CoMa I Programmierziele Linux bedienen Code umschreiben strukturierte Datentypen Anweisungen und Kontrollstrukturen

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Konstruktor, Statische Methoden Packages Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Initialisierung von Datenstrukturen

Mehr

Programmierung für Mathematik (HS13)

Programmierung für Mathematik (HS13) software evolution & architecture lab Programmierung für Mathematik (HS13) Übung 5 1 Aufgabe: Eclipse IDE 1.1 Lernziele 1. Die Entwicklungsumgebung Eclipse einrichten. 2. Eclipse kennen lernen und mit

Mehr

Java Virtual Machine (JVM) Bytecode

Java Virtual Machine (JVM) Bytecode Java Virtual Machine (JVM) durch Java-Interpreter (java) realisiert abstrakte Maschine = Softwareschicht zwischen Anwendung und Betriebssystem verantwortlich für Laden von Klassen, Ausführen des Bytecodes,

Mehr

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. michael.roth@h-da.de. Hochschule Darmstadt -Fachbereich Informatik-

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. michael.roth@h-da.de. Hochschule Darmstadt -Fachbereich Informatik- Informatik Studiengang Chemische Technologie Michael Roth michael.roth@h-da.de Hochschule Darmstadt -Fachbereich Informatik- WS 2012/2013 Inhalt Teil VII Einstieg in Java I Michael Roth (h_da) Informatik

Mehr

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

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen Programmieren 10. Tutorium 4./ 5. Übungsblatt Inhalt I. Übungsblatt 4 II. III. - Rückgabe und Besprechung - Vorbereitung auf Wiederholung/ Nachtrag - Operatorpräzedenzen IV. Übungsblatt 5 - Vorstellung

Mehr

Binärdarstellung von Fliesskommazahlen

Binärdarstellung von Fliesskommazahlen Binärdarstellung von Fliesskommazahlen 1. IEEE 754 Gleitkommazahl im Single-Format So sind in Gleitkommazahlen im IEEE 754-Standard aufgebaut: 31 30 24 23 0 S E E E E E E E E M M M M M M M M M M M M M

Mehr

Kapiteltests zum Leitprogramm Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm

Mehr

Robot Karol für Delphi

Robot Karol für Delphi Robot Karol für Delphi Reinhard Nitzsche, OSZ Handel I Version 0.1 vom 24. Januar 2003 Zusammenfassung Nach der Einführung in die (variablenfreie) Programmierung mit Robot Karol von Freiberger und Krško

Mehr

Kompilieren und Linken

Kompilieren und Linken Kapitel 2 Kompilieren und Linken Bevor wir uns auf C++ selbst stürzen, brauchen wir einiges Vorgeplänkel, wie man komfortabel ein größeres C++- kompilieren kann. Mit Java stellt sich der Kompiliervorgang

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 16

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 16 Kapitel 5 Arithmetische Operatoren Seite 1 von 16 Arithmetische Operatoren - Man unterscheidet unäre und binäre Operatoren. - Je nachdem, ob sie auf einen Operanden wirken, oder eine Verknüpfung zweier

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API). Paketdeklaration Paketdeklaration package Bezeichner ; Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API). Ein

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

IT-Basics 2. DI Gerhard Fließ

IT-Basics 2. DI Gerhard Fließ IT-Basics 2 DI Gerhard Fließ Wer bin ich? DI Gerhard Fließ Telematik Studium an der TU Graz Softwareentwickler XiTrust www.xitrust.com www.tugraz.at Worum geht es? Objektorientierte Programmierung Konzepte

Mehr

VBA-Programmierung: Zusammenfassung

VBA-Programmierung: Zusammenfassung VBA-Programmierung: Zusammenfassung Programmiersprachen (Definition, Einordnung VBA) Softwareentwicklung-Phasen: 1. Spezifikation 2. Entwurf 3. Implementierung Datentypen (einfach, zusammengesetzt) Programmablaufsteuerung

Mehr

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes. Binäre Bäume Definition: Ein binärer Baum T besteht aus einer Menge von Knoten, die durch eine Vater-Kind-Beziehung wie folgt strukturiert ist: 1. Es gibt genau einen hervorgehobenen Knoten r T, die Wurzel

Mehr

1. Formulieren Sie den Algorithmus <Bedienung eines Getränkeautomaten> nach den oben genannten Kriterien.

1. Formulieren Sie den Algorithmus <Bedienung eines Getränkeautomaten> nach den oben genannten Kriterien. Java 1 Einführung Grundlegende Übungsaufgaben Arbeitsauftrag 1.1 1. Formulieren Sie den Algorithmus nach den oben genannten Kriterien. Beispiel: Bedienung eines Getränkeautomaten

Mehr

Zahlensysteme: Oktal- und Hexadezimalsystem

Zahlensysteme: Oktal- und Hexadezimalsystem 20 Brückenkurs Die gebräuchlichste Bitfolge umfasst 8 Bits, sie deckt also 2 8 =256 Möglichkeiten ab, und wird ein Byte genannt. Zwei Bytes, also 16 Bits, bilden ein Wort, und 4 Bytes, also 32 Bits, formen

Mehr

5.4 Klassen und Objekte

5.4 Klassen und Objekte 5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen

Mehr

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Zählen und Zahlbereiche Übungsblatt 1 1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Für alle m, n N gilt m + n = n + m. in den Satz umschreiben:

Mehr

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11 Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11 Fakultät für Informatik Lehrstuhl 1 Dr. Lars Hildebrand Carla Delgado-Battenfeld Fatih Gedikli Tobias Marschall Benjamin Schowe

Mehr

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1 Was sind Operatoren? Ein Operator ist eine in die Programmiersprache eingebaute Funktion,

Mehr

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen 4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen Highlights: objektorientierte Sprache Plattformunabhängigkeit bei Hardware und Betriebssystem optimale Einbindung im Internet und Intranet

Mehr

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr