Java, OO und UML Übersicht ● Vorstellung des OO-Paradigmas ● Umsetzung des OO-Paradigmas in Java ● ● Einführung (seeeeeehr rudimenter) in UML zur graphischen Darstellung von OO Grammatik und Semantik von Java Das Objektorientierte Paradigma ● ● OO bildet keine geschlossene theoretisch abgegrenzte Basis (wie z.B. das Relationsmodell relationaler Datenbanken) OO ist eine Sammlung und Nutzung mehrerer Prinzipien – Klasse (Kapselung) – Objekte (Kapselung) – Vererbung – Nachricht – Polymorphie – Identität (von Objekten) Das Objektorientierte Paradigma ● ● ● Unterschiedliche Ansätze der OOUmsetzung sind möglich Dies schlägt sich in der Vielzahl OOfähiger Sprachen nieder Sprachen wie Eiffel setzen das OOParadigma am konkretesten um, hier ist alles Objekt, es gibt keine primitiven Datentypen Das Objektorientierte Paradigma ● ● ● ● ● Um das Paradigma von der reellen Implementierung abzugrenzen, gibt es Beschreibungssprachen Diese geben OO-Konzepte sprachneutral wieder Die bekannteste und verbreitetste ist UML UML ist zudem eine graphische Beschreibungssprache Die OO-Konzepte von Java werden im folgenden in UML mitdargestellt Vokabeln lernen Java und Grammatik Java - Grammatik ● ● ● ● Für alle Programmiersprachen gilt, dass sie einer Grammatik genügen müssen Diese Grammatik ist eben genau durch den Compiler, der den Quellcode in Maschinensprache übersetzt, festgelegt Genügt der Quellcode nicht der Grammatik der Sprache, in der er geschrieben ist, gibt der Compiler Fehler aus Ein theoretisches Konstrukt für Grammatiken ist die Backus-NaurNotation Java - Grammatik Auszug aus der Java-Grammatik in EBNF: ... Type ReferenceType ::= ( ReferenceType | PrimitiveType ); ::= ( PrimitiveType ( "[" "]" )+ | ( ClassOrInterfaceType ) ( "[" "]" )* ); ClassOrInterfaceType ::= <IDENTIFIER> ( TypeArguments )? ( "." <IDENTIFIER> ( TypeArguments )? )*; TypeArguments ::= "<" TypeArgument ( "," TypeArgument )* ">"; TypeArgument ::= ( ReferenceType | "?" ( WildcardBounds )? ); WildcardBounds ::= ( "extends" ReferenceType | "super" ReferenceType ); PrimitiveType ::= ( "boolean" | "char" | "byte" | "short" | "int" | "long" | "float" | "double" ); ... Beispiele: boolean boolean[] String String[] Testclass.innerClassType Testclass.innerClassType[] ... Java - Grammatik ● Java-Quellcode setzt sich grammatisch zusammen aus: – Bezeichner oder Identifier – Schlüsselworte (sog. Terminale) – Literale – Operatoren – Trennzeichen Java - Grammatik public class test { public alert(String text) { System.out.println(text + „ TEST“); } } * Bezeichner oder Identifier * Schlüsselworte (sog. Terminale) * Literale * Operatoren * Trennzeichen Die Konzepte des Paradigmas Konzepte des Paradigmas - Klasse ● ● Ist die grundlegende Beschreibung von gleichartigen Objekten Diese teilen sich dadurch – Attribute – Operatoren – Methoden – Beziehungen – Semantik Konzepte des Paradigmas - Klasse ● ● ● ● Es gibt konkrete und abstrakte Klassen Konkrete Klassen beinhalten ausprogrammierte Methoden, abstrakte Klassen nicht Abstrakte Klassen dienen als Strukturierungsmittel beider Vererbung Abtstrakte Klassen heissen in Java Interfaces (bzw. werden als solche verwendet) Konzepte des Paradigmas - Klasse ● Darstellung in UML Konzepte des Paradigmas - Klasse ● ... und in Java class Mediafile { // Attribute // Methoden } Konzepte des Paradigmas - Objekt ● ● ● Ist die konkrete Ausprägung einer Klasse Vereinfacht gesagt, die durch den Objektnamen eindeutig bezeichnete Kopie des Klassenquellcodes im Speicher In UML Konzepte des Paradigmas - Objekt Konzepte des Paradigmas - Objekt ● ● ● In Java... ...wird ein Objekt durch den new – Operator erzeugt – Klasse Objektname = new Konstruktor() – Testclass test = new Testclass(); Ist in einer Klasse kein dedizierter Konstruktor implementiert, erzeugt Java einen Standardkonstruktor Konzepte des Paradigmas - Attribut ● ● ● ● ● Ist ein bennanter Speicherplatz innerhalb einer Klasse Beschreibt eine Menge von gültigen Wertebelegungen innerhalb der Objekte Diese Mengen werden als Typ des Attributes bezeichnet Im Normalfall sind alle Attribute separiert Sollen Attribute klassenweit für Objekte gelten, muß dies explizit angegeben werden Konzepte des Paradigmas - Attribut ● ● ● ● Dies gilt ebenso für eine evt. Konstantenverwendung eines Attributes Attribute können in ihrer Sichtbarkeit definiert werden (public, protected, private) Zudem gibt es abgeleitete Attribute Diese werden durch Methoden aus bestehenden Attributen errechnet Konzepte des Paradigmas - Attribut ● Attribute in UML Konzepte des Paradigmas - Attribut ● Attribute in UML – +, - und # bezeichnen die Sichtbarkeit public, private und protected – [] bezeichnen Multiplizität des Attributes (Array) – / bezeichnet ein abgeleitetes Attribut – Reihenfolge ist: ● ● ● ● Sichtbarkeit Multiplizität Bezeichnung Typ Konzepte des Paradigmas - Attribut ● In Java public class TestKlasse { boolean testAttrib1 = false; protected int testAtttrib2 =42; private char testAttrib3; short testArray[]; final double pi = 3.14; static int noOfTestKlasse; } Konzepte des Paradigmas - Attribut ● ● ● Kurzer Einschub über den Scope / Gültigkeitsbereich von Attributen Faustregel: Innerhalb des Klammerpaares, das den Bereich umschliesst, in dem das Attribut definiert wurde, gilt das Attribut als sicht- und veränderbar. Alle Attribute, die direkt im Körper der Klasse definiert sind, sind demnach für alle Methoden der Klasse sichtbar Konzepte des Paradigmas - Attribut ● ● ● Weiter können aber auch Attribute hier definiert werden: – Methoden – Schleifen – Verzweigungen – Anonymen Blöcken Diese sind dann (siehe Faustregel) nur in der jeweiligen Struktur sichtbar Doppelte Definitionen sind allerdings verboten Konzepte des Paradigmas - Attribut public class Testclass { public int number = 5; public add(int new_number) { number = number + new_number; // eigentlich this.number // kann aber bei Eindeutigkeit entfallen } public check() { int check_value = 10; if (number > check_value) { String output1 = „Is greater than 10“; System.out.println(output1); } else { String output2 = „Is lesser than 10“; System.out.println(output2); } System.out.println(output1); // FEHLER, nicht sichtbar! } } Konzepte des Paradigmas - Attribut ● Primitive Datentypen in Java Primitiver Typ Größe in Bit Wertebereich Wrapper-Typ boolean char 1 16 Boolean Character byte short int long float double void 8 16 32 64 32 64 - Unicode 0 Unicode 216-1 (-128) - (+127) (-2^15)-(+2^15-1) (-2^31)-(+2^31-1) (-2^63)-(2^63-1) IEEE754 IEEE754 - ● Byte Short Integer Long Float Double Void Wrappertypen sind Klassen für prim. Datentypen (Objekt <-> Wert) Konzepte des Paradigmas - Identität ● ● ● ● Identität unterscheidet Objekte voneinander Theoretisch und praktisch können Objekte gleichen Typs zur gleichen Zeit – Gleiche Werte – Gleichen Namen – Gleichen Zustand haben. Zur Unterscheidung erzeugt Java den OID (Object identifier) automatisch Dieser ist komplett unsichtbar