Programmieren mit JAVA

Slides:



Advertisements
Ähnliche Präsentationen
Objektorientierte Programmierung
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
Kritische Betrachtung
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
der Universität Oldenburg
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Abstrakte Klassen.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Einführung in die OOP in Java
Einführung in die Programmierung mit Java
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Packages Vortrag : Cornelia Hardt 23. November 1999.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
Abstrakte Klassen DVG
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Objektorientiertes Konstruieren
Objektorientierte Programmierung
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
EPROG Tutorium #3 Philipp Effenberger
Programmiervorkurs WS 2014/15 Instanzmethoden
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 7. Vorlesung WS 2002/2003.
Abstrakte Klassen und das Interface-Konzept
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Objektorientierte Programmierung mit JAVA. © Klasse Wie in C++ ist die Klasse das primäre Mittel um ein Entity abzubilden Die Eigenschaften.
C++ FÜR cOMPUTERSPIELENTWICKLER
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
OOP II.
Java-Kurs - 5. Übung Das Paradigma der Objektorientierung (OO)
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Implementieren von Klassen
 Präsentation transkript:

Programmieren mit JAVA Teil III

Hauptbestandteile der Sprache Token Typen Ausdrücke und Operatoren Anweisungen Klassen Methoden Schnittstellen Pakete Variablen Token: sind die Bestandteile des Java-Quellcodes,die sich in logische Einheiten zerlegen lassen und gültigen Arten zuordnen lassen (Bezeichner, Schlüsselwörter, Literale, Operatoren, Trennzeichen Typ gibt an, wie ein einfaches Objekt im Speicher des Computers dargestellt wird. (Wertebereich) Ausdrücke drücken einen Wert entweder direkt oder durch Berechnung aus oder sind Kontrollausdrücke zur Ablaufsteuerung des Programms. Bestehen aus Operanten, Operatoren und anderen Ausdrücken. Anweisungen sind Kontrollfluß oder Ausnahmeanweisungen und werden der Reihe nach ausgeführt. (Block, Deklaration, Ausdruck, Auswahl, Iteration, Sprung...) Weiter geht’s mit den Klassen in Java...

Klassen Eine Klassendefinition in Java wird durch das Schlüsselwort class eingeleitet. Anschließend folgt innerhalb von geschweiften Klammern eine beliebige Anzahl an Variablen- und Methodendefinitionen. Das folgende Listing ist ein Beispiel für eine einfache Klassendefinition: public class Auto { public String name; public int erstzulassung; public int leistung; } Diese Klasse enthält keine Methoden, sondern lediglich die Variablen name, erstzulassung und leistung. Eine solche methodenlose Klassendefinition entspricht dem Konzept des Verbunddatentyps aus C oder PASCAL (struct bzw. record). Die innerhalb einer Klasse definierten Variablen wollen wir im folgenden (analog zu C++) als Membervariablen bezeichnen.

Klasse - Deklaration Syntax: [modifiers] class NeueKlasse [extends NamederSuperklasse] [implements NamederSchnittstelle] 4 Eigenschaften einer Klasse können in der Deklaration definiert werden: Modifier Klassenname Superklasse Schnittstellen

Klasse - Modifier keinen (freundliche Klasse) können nur von Objekten eines Paketes genutzt werden public alle Objekte können auf diese Klasse zugreifen final kann nicht mehr abgeleitet werden (haben keine Subklassen) abstract von dieser Klasse wird nie eine Instanz benötigt und kann auch keine bilden, sie dient zu allgemeinen Verweisen

Klasse - Klassenname jede Klasse muss einen eigenen Namen haben Regel für den Namen siehe Token man sollte sprechende Klassennamen verwenden der Name sollte mit einem Großbuchstaben beginnen, der Rest Kleinbuchstaben hat der Name mehrere Wörter, so darf kein Leerzeichen dazwischen sein Bsp.: MeineNeueKlasse

Klasse - Superklassen mit dem Schlüsselwort extends spezifiziert man die Klasse, auf welche die neue Klasse aufbaut die Superklasse wird durch die neue Klasse erweitert (Vererbung) Bsp.: import java.awt.Graphics; public class HelloJavaApplet extends java.applet.Applet { public void paint(Graphics g) { g.drawString("Hello Java!",5,25); }

Klasse - Schnittstelle statt Mehrfachvererbung gibt es das Schnittstellenkonzept Objekte können eine beliebige Zahl davon implementieren sind Sammlungen von Methodennamen ohne konkrete Definition deshalb muss jede nichtabstrakte Klasse alle in der Schnittstelle deklarierten Methoden überschreiben

Objekte Um von einer Klasse ein Objekt anzulegen, muß eine Variable vom Typ der Klasse deklariert werden und ihr mit Hilfe des new-Operators ein neu erzeugtes Objekt zugewiesen werden Bsp.: Auto meinKombi; meinKombi = new Auto(); public class Auto { public String name; public int erstzulassung; public int leistung; } Die erste Anweisung ist eine normale Variablendeklaration, (Java kennt 3 Variablen: Klassenvariable, Instanzvariable und lokale Variable)wie sie aus Kapitel 4 bekannt ist. Anstelle eines primitiven Typs wird hier der Typname einer zuvor definierten Klasse verwendet. Im Unterschied zu primitiven Datentypen wird die Objektvariable meinKombi als Referenz gespeichert. Die zweite Anweisung generiert mit Hilfe des new-Operators eine neue Instanz der Klasse Auto und weist sie der Variablen meinKombi zu. In Java wird jede selbstdefinierte Klasse mit Hilfe des new-Operators instanziert. Mit Ausnahme von Strings und Arrays, bei denen der Compiler auch Literale zur Objekterzeugung zur Verfügung stellt, gilt dies auch für alle vordefinierten Klassen der Java-Klassenbibliothek. Deklaration und Instanzerzeugung kann man bei primitiven Variablen kombinieren. Auto meinKombi = new Auto();

Objekte Nach der Initialisierung haben alle Variablen des Objekts zunächst Standardwerte Referenztypen haben den Standardwert null, die Standardwerte der primitiven Typen können V2 entnommen werden Der Zugriff auf sie erfolgt mit Hilfe der Punktnotation Objekt.Variable Bsp.: meinKombi.name = "Mercedes 600"; meinKombi.erstzulassung = 1972; meinKombi.leistung = 250; public class Auto { public String name; public int erstzulassung; public int leistung; }

Objekte auch der lesende Zugriff erfolgt mit Hilfe der Punktnotation Bsp.: System.out.println("Name........: "+meinKombi.name); System.out.println("Zugelassen..: "+meinKombi.erstzulassung); System.out.println("Leistung....: "+meinKombi.leistung);

Methoden Methoden definieren das Verhalten von Objekten Sie werden innerhalb einer Klassendefinition angelegt Sie haben Zugriff auf alle Variablen des Objekts Methoden sind das Pendant zu den Funktionen anderer Programmiersprachen Sie arbeiten aber immer nur mit den Variablen des aktuellen Objekts In Java gibt es keine globalen Methoden wie auch keine globale Variablen

Methoden - Syntax [Modifier] /* private, protected, public, static, final */ Typ Name([Parameter]) /*Typ des Rückgabewerts der Funktion, ihr Name und eine optionale Parameterliste */ { Anweisung; /* Methodenrumpf=Liste der Anweisungen, die das Verhalten der Methode festlegen */ }

Methode - Beispiel Beispielklasse Auto um eine Methode zur Berechnung des Alters des Auto-Objekts erweitert: public class Auto { public String name; public int erstzulassung; public int leistung; public int alter() return 1999 - erstzulassung; }

Methode - Aufruf Der Aufruf einer Methode erfolgt ähnlich der Verwendung einer Instanzvariablen in Punktnotation Zur Unterscheidung von einem Variablenzugriff müssen zusätzlich die Parameter der Methode in Klammern angegeben werden, selbst wenn die Liste leer ist Bsp.: Auto golf1 = new Auto(); golf1.erstzulassung = 1990; System.out.println(golf1.alter()); Welcher Wert wird ausgegeben? Wie an der Definition von alter zu erkennen ist, darf eine Methode auf die Instanzvariablen ihrer Klasse zugreifen, ohne die Punktnotation zu verwenden. Das funktioniert deshalb, weil der Compiler alle nicht in Punktnotation verwendeten Variablen x, die nicht lokale Variablen sind, auf das Objekt this bezieht und damit als this.x interpretiert. Bei this handelt es sich um einen Zeiger, der beim Anlegen eines Objekts automatisch generiert wird. this ist eine Referenzvariable, die auf das aktuelle Objekt zeigt und dazu verwendet wird, die eigenen Methoden und Instanzvariablen anzusprechen. Der this-Zeiger ist auch explizit verfügbar und kann wie eine ganz normale Objektvariable verwendet werden. Er wird als versteckter Parameter an jede nicht-statische Methode übergeben. Die Methode alter hätte also auch so geschrieben werden können: public int alter() { return 1999 - this.erstzulassung; }

Methoden - Parameter Eine Methode kann mit Parametern definiert werden Jeder formale Parameter besteht aus einem Typnamen und dem Namen des Parameters Mehrere Parameter sind durch Kommata zu trennen Bsp.: public void printAlter(int wieoft) { while (wieoft-- > 0) { System.out.println("Alter = " + alter()); } } Alle Parameter werden in Java per call by value übergeben. Beim Aufruf einer Methode wird also der aktuelle Wert in die Parametervariable kopiert und an die Methode übergeben. Veränderungen der Parametervariablen innerhalb der Methode bleiben lokal und wirken sich nicht auf den Aufrufer aus. Das folgende Beispiel definiert eine Methode printAlter, die das Alter des Autos insgesamt wieoft mal auf dem Bildschirm ausgibt:

Wie oft wird in diesem Programm das Alter des Autos ausgegeben Wie oft wird in diesem Programm das Alter des Autos ausgegeben? public class Auto { public int erstzulassung; Auto meinAuto = new Auto(); meinAuto.erstzulassung = 1990; public int alter() { return 1999 - erstzulassung; } public void printAlter(int wieoft) { while (wieoft-- > 0) { System.out.println("Alter = " + alter()); } } int a = 3; auto.printAlter(a); auto.printAlter(a); }

Methoden - Übergabe von Objekten Die Methode erhält keine Kopie, sondern arbeitet mit dem Originalobjekt Sollen Objekte kopiert werden, so muss dies explizit durch Aufruf der Methode clone der Klasse Object erfolgen.

Methoden - Rückgabe Jede Methode in Java ist typisiert Der Typ einer Methode wird zum Zeitpunkt der Definition festgelegt und bestimmt den Typ des Rückgabewerts Dieser kann von einem beliebigen primitiven Typ, einem Objekttyp oder vom Typ void sein Die Methoden vom Typ void haben gar keinen Rückgabewert und dürfen nicht in Ausdrücken verwendet werden Hat eine Methode einen Rückgabewert, so kann sie mit Hilfe der return-Anweisung einen Wert an den Aufrufer zurückgeben Syntax: return Ausdruck; Wenn die return Anweisung ausgeführt wird, führt dies zum Beenden der Methode, und der Wert des angegebenen Ausdrucks wird an den Aufrufer zurückgegeben. Der Ausdruck muß dabei zuweisungskompatibel zum Typ der Funktion sein. Die in Kapitel 5 erläuterte Datenflußanalyse sorgt dafür, daß hinter der return-Anweisung keine unerreichbaren Anweisungen stehen und daß jeder mögliche Ausgang einer Funktion mit einem return versehen ist. Der in C beliebte Fehler, die return-Anweisung einer Funktion zu vergessen und damit einen undefinierten Rückgabewert zu erzeugen, kann in Java nicht auftreten.

Methoden - Überladen In Java ist es erlaubt, innerhalb einer Klasse zwei unterschiedliche Methoden mit demselben Namen zu definieren Der Compiler unterscheidet die verschiedenen Varianten anhand der Anzahl und Typisierung der Parameter Überladen von Methoden ist dann sinnvoll, wenn die gleichnamigen Methoden auch eine vergleichbare Funktionalität haben Bsp.: public int alter(String titel) { int alter = alter(); System.out.println(titel+alter); return alter; } Es ist also nicht erlaubt, zwei Methoden mit exakt demselben Namen und identischer Parameterliste zu definieren. Dabei werden auch zwei Methoden, die sich nur durch den Typ ihres Rückgabewertes unterscheiden, als gleich angesehen. Eine typische Anwendung von überladenen Methoden besteht in der Simulation von variablen Parameterlisten (die als Feature direkt in Java nicht zur Verfügung stehen). Auch, um eine Funktion, die bereits an vielen verschiedenen Stellenim Programm aufgerufen wird, um einen weiteren Parameter zu erweitern, ist es nützlich, diese Funktion zu überladen, um nicht alle Aufrufstellen anpassen zu müssen. Innerhalb dieser Methode wird der Name alter in drei verschiedenen Bedeutungen verwendet. Erstens ist alter der Name der Methode selbst. Zweitens wird die lokale Variable alter definiert, um drittens den Rückgabewert der parameterlosen alter-Methode aufzunehmen. Der Compiler kann die Namen in allen drei Fällen unterscheiden, denn er arbeitet mit der Signatur der Methode. Unter der Signatur einer Methode versteht man ihren internen Namen. Dieser setzt sich aus dem nach außen sichtbaren Namen plus codierter Information über die Reihenfolge und Typen der formalen Parameter zusammen. Die Signaturen zweier gleichnamiger Methoden sind also immer dann unterscheidbar, wenn sie sich wenigstens in einem Parameter voneinander unterscheiden.

Methoden - Konstruktoren Konstruktoren sind spezielle Methoden, die bei der Initialisierung von Objekten aufgerufen werden. ~ werden als Methoden ohne Rückgabewert definiert, die den Namen der Klasse erhalten, zu der sie gehören Konstruktoren dürfen eine beliebige Anzahl an Parametern haben und können überladen werden Soll ein Objekt unter Verwendung eines parametrisierten Konstruktors instanziert werden, so sind die Argumente wie bei einem Methodenaufruf in Klammern nach dem Namen des Konstruktors anzugeben Nicht expliziet eingehen auf Default-Konstruktoren (Klasse hat überhaupt keinen Konstruktor) Verkettung von Konstruktoren (Spart Quelltext wenn man in einem Konstruktor einen anderen Aufruft)

Methoden - Konstruktoren Bsp.: public class Auto { public String name; public int erstzulassung; public int leistung; public Auto(String name) { this.name = name; } Auto dasAuto = new Auto("Porsche 911"); System.out.println(dasAuto.name); } In diesem Fall wird zunächst Speicher für das Auto-Objekt beschafft und dann der Konstruktor aufgerufen. Dieser initialisiert seinerseits die Instanzvariable name mit dem übergebenen Argument "Porsche 911". Der nachfolgende Aufruf schreibt dann diesen Text auf den Bildschirm. Explizite Konstruktoren werden immer dann eingesetzt, wenn zur Initialisierung eines Objektes besondere Aufgaben zu erledigen sind. Es ist dabei durchaus gebräuchlich, Konstruktoren zu überladen und mit unterschiedlichen Parameterlisten auszustatten. Beim Ausführen der new-Anweisung wählt der Compiler anhand der aktuellen Parameterliste den passenden Konstruktor und ruft ihn mit den angegebenen Argumenten auf.

mehrere Konstruktoren public class Auto { public String name; public int erstzulassung; public int leistung; public Auto(String name){ this.name = name; } public Auto(String name, int erstzulassung, int leistung) { this.name = name; this.erstzulassung = erstzulassung; this.leistung = leistung; } } Wir wollen das vorige Beispiel um einen Konstruktor erweitern, der alle Instanzvariablen initialisiert Wie können hier verschiedene Autoobjekte mit unterschiedlichen Parameterlisten im Konstruktoraufruf iniziert werden? 001 Auto dasAuto = new Auto("Porsche 911"); 002 System.out.println(dasAuto.name); 001 Auto dasAuto = new Auto("Porsche 911", 1995, 250); 003 System.out.println(dasAuto.erstzulassung); 004 System.out.println(dasAuto.leistung); Es ist dabei durchaus gebräuchlich, Konstruktoren zu überladen und mit unterschiedlichen Parameterlisten auszustatten. Beim Ausführen der new-Anweisung wählt der Compiler anhand der aktuellen Parameterliste den passenden Konstruktor und ruft ihn mit den angegebenen Argumenten auf.

Methoden - Destruktoren Destruktoren werden unmittelbar vor dem Zerstören eines Objekts aufgerufen Ein Destruktor wird als geschützte parameterlose Methode mit dem Namen finalize definiert Syntax: protected void finalize() { ... } Da Java über ein automatisches Speichermanagement verfügt, kommt den Destruktoren eine viel geringere Bedeutung zu als in anderen objektorientierten Sprachen Tatsächlich garantiert die Sprachspezifikation nicht, daß ein Destruktor überhaupt aufgerufen wird. Wenn er aber aufgerufen wird, so erfolgt dies nicht, wenn die Lebensdauer des Objektes endet, sondern dann, wenn der Garbage Collector den für das Objekt reservierten Speicherplatz zurückgibt. Dies kann unter Umständen nicht nur viel später der Fall sein (der Garbage Collector läuft ja als asynchroner Hintergrundprozeß), sondern auch gar nicht. Wird nämlich das Programm beendet, bevor der Garbage Collector das nächste Mal aufgerufen wird, werden auch keine Destruktoren aufgerufen. Selbst wenn Destruktoren aufgerufen werden, ist die Reihenfolge oder der Zeitpunkt ihres Aufrufs undefiniert. Der Einsatz von Destruktoren in Java sollte also mit der nötigen Vorsicht erfolgen.

Weiter: Vererbung Attribute von Klassen, Methoden und Variablen Klassen mit static-Elementen Abstrakte Klassen und Methoden Interfaces Spezielle Klassen ...