Prozeduren vs. Funktionen

Ähnliche Dokumente
Kapitel 6: Prozedurale Konzepte in Java i

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 14/ / 295

Grundelemente objektorientierter Sprachen (1)

Grundelemente objektorientierter Sprachen (1)

Implementieren von Klassen

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Einführung in die Programmierung WS 2009/10. Übungsblatt 5: Typen, Variablen und einfache Methoden in Java

Methoden und Wrapperklassen

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

AuD-Tafelübung T-B5b

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Programmieren in Java

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Einführung in die Programmierung

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Repetitorium Informatik (Java)

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Abschnitt 11: Korrektheit von imperativen Programmen

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

Java Einführung Methoden. Kapitel 6

Einstieg in die Informatik mit Java

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

12 Abstrakte Klassen, finale Klassen und Interfaces

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

JAVA - Methoden

Umsetzung einer Klassenkarte in einer Programmiersprache

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Programmiertechnik Klassenvariablen & Instantiierung

Klassenvariablen und statische Methoden

Objektorientierte Programmierung Studiengang Medieninformatik

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

3. Anweisungen und Kontrollstrukturen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Einstieg in die Informatik mit Java

Vorkurs Informatik WiSe 16/17

Statische und Nichtstatische Methoden Properties/ Eigenschaften

JAVA - Methoden - Rekursion

Tag 8 Repetitorium Informatik (Java)

Vorkurs Informatik WiSe 17/18

Variablen in Java. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang. Ziele

2. Unterprogramme und Methoden

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Vererbung, Polymorphie

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Vorbereitende Aufgaben

Javakurs für Anfänger

Java I Vorlesung Vererbung und Sichtbarkeit

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Java I Vorlesung Imperatives Programmieren

Grundlagen der Programmierung in C Funktionen

1 Klassen und Objekte

Programmierkurs. Manfred Jackel

Softwareentwicklung I (IB) Objekte. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

2 Programmieren in Java I noch ohne Nachbearbeitung

Einstieg in die Informatik mit Java

1 KLASSENKOMPONENTEN. Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen

Javakurs für Anfänger

Kapitel 3. Programmierkurs. Arten von Anweisungen. 3.1 Was sind Anweisungen?

Transkript:

Prozeduren vs. Funktionen Mit der Formalisierung wird auch der Unterschied zwischen Prozeduren und Funktionen noch einmal klar. Der Aufruf beider Varianten bewirkt zunächst das Gleiche: die Eingabevariablen werden mit konkreten Werten belegt. Bei Funktionen wird anschließend der Wert des Rumpfes der Funktion (ein Ausdruck) ausgewertet; der Funktionsaufruf ist ja selbst wieder ein Ausdruck (mit einem Wert). Dabei wird die Variablenbelegung innerhalb des Rumpfes der Funktion nicht verändert, wir haben keine Zustandsänderung (daher hatten wir auch keinen Zustandsbegriff benötigt). Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 379 / 749

Prozeduren vs. Funktionen Bei Prozeduren können weitere Variablen und Konstanten (mit entsprechenden Belegungen) zu der Menge der Eingabevariablen hinzukommen. Die Anweisungen im Rumpf verändern ggf. deren Belegungen (das sind die vielbeschworenen Seiteneffekte), was wir mit dem Zustandsbegriff modelliert haben. Bei der (nicht seltenen) Mischform, Prozeduren die einen Rückgabewert vom Typ T void besitzen, stellt der Ausdruck nach der return-anweisung also nicht notwendigerweise den direkten Zusammenhang zwischen Eingabewerten und Ausgabe dar, da der Zustand am Ende des Methodenrumpfes typischerweise nicht mehr mit dem Startzustand (bei Aufruf) übereinstimmt. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 380 / 749

Globale Größen Variablen und Konstanten, so wie wir sie bisher kennengelernt haben, sind lokale Größen, d.h. sie sind nur innerhalb des Blocks (auch Methodenrumpf), der sie verwendet, bekannt. Es gibt auch globale Variablen und Konstanten, die in mehreren Algorithmen (Methoden und sogar Klassen) bekannt sind. Diese globalen Größen sind z.b. für den Datenaustausch zwischen verschiedenen Algorithmen geeignet. Sie können in einem Modul (Klassenvereinbarung) spezifiziert werden und (wenn sie als public deklariert wurden) von den Methoden aller anderen Module (Klassen) verwendet werden. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 381 / 749

Globale Größen Globale Variablen heißen in Java Klassenvariablen, die man üblicherweise am Beginn einer Klasse (das muss aber syntaktisch nicht sein) definiert. Wie erwähnt, gelten diese Variablen in der gesamten Klasse (im gesamten Modul) und ggf. auch darüber hinaus, stehen also für die Bildung von Ausdrücken zur Verfügung. Die Definition wird von den Schlüsselwörtern public und static eingeleitet (deren genaue Bedeutung wir immer noch erst später kennen lernen). Klassenvariablen kann man auch als Konstanten definieren, wie bei lokalen Konstanten dient hierzu das Schlüsselwort final Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 382 / 749

Globale Konstante Beispiel public class Kreis { /** * Die Konstante spezifiziert die Kreiszahl pi. */ public static final double PI = 3.14159; /** * Berechnung des Umfangs eines Kreises mit gegebenem Radius. * @param radius Der Radius des Kreises. * @return Der Umfang des Kreises. */ public static double kreisumfang(double radius) { return 2 * PI * radius; Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 383 / 749

Globale Variable Beispiel public class OhneGlobaleVar { public static void add(int x) { int sum = 0; sum = sum + x; public class MitGlobalerVar { public static int sum = 0; public static void add(int x) { sum = sum + x; public static void main(string[] args) { int sum = 0; add(3); add(5); add(7); System.out.println("Summe: "+sum); public static void main(string[] args) { int sum = 0; add(3); add(5); add(7); System.out.println("Summe: "+sum); Ausgabe: Summe: 0 Ausgabe: Summe: 15 Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 384 / 749

Globale Größen Im Gegensatz zu lokalen Variablen muss man Klassenvariablen nicht explizit initialisieren. Sie werden dann automatisch mit ihren Standardwerten initialisiert: Typ Standardwert boolean false char u0000 byte, short, int, long 0 float, double 0.0 Klassenkonstanten müssen dagegen explizit initialisiert werden. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 385 / 749

Sichtbarkeit globaler Größen Lokale Variablen innerhalb einer Klasse können genauso heißen wie eine Klassenvariable. Beispiel: public class Sichtbarkeit { public static int variablenname; public static void main(string[] args) { boolean variablenname = true; Das bedeutet: Während bei lokalen Variablen Sichtbarkeit und Gültigkeit zusammenfallen, muss man zwischen beiden Eigenschaften bei Klassenvariablen prinzipiell unterscheiden. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 386 / 749

Sichtbarkeit globaler Größen Das ist kein Widerspruch zum Verbot, den gleichen Namen innerhalb des Gültigkeitsbereichs einer Variable nochmal zu verwenden, denn genau genommen heißt die Klassenvariable anders. Zu ihrem Namen gehört der vollständige Klassenname, in dem die Variable/Konstante definiert wurde (übrigens inklusive des Package-Namens, was ein Package ist, lernen wir aber Sie ahnen es erst später). Unter dem vollständigen Namen ist eine globale Größe auch dann sichtbar, wenn der innerhalb der Klasse geltende Name durch den identisch gewählten Namen einer lokalen Variable verdeckt ist. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 387 / 749

Sichtbarkeit globaler Größen I.Ü. gilt diese Namensregel analog für unsere (statischen) Methoden; dadurch können auch Methoden, die gleich benannt sind (und sogar die selbe Signatur haben) aber in unterschiedlichen Klassen vereinbart wurden, eindeutig unterschieden werden. Das ist nicht ganz unwichtig schließlich könnte es in einem großen Software-Kosmos dann nur jeweils eine einzige Methode mit einer speziellen Signatur type m(inputtype inputparam) geben. Vorsicht, das hat nix äh tschuldigung: nichts mit dem Konzept des Überladens zu tun! Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 388 / 749

Namen statischer Elemente Beispiel: Der (vorläufig) vollständige Name der Konstanten PI aus der Klasse Kreis ist also: Kreis.PI und stellt die Kreiszahl allen Modulen zur Verfügung. Das uns bereits bekannte Modul Math stellt zwei Konstanten zur Verfügung: die Eulersche Zahl Math.E (The double value that is closer than any other to e, the base of the natural logarithms) und ebenfalls die Kreiszahl Math.PI (The double value that is closer than any other to π, the ratio of the circumference of a circle to its diameter) Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 389 / 749

Namen statischer Elemente Beispiel mit Methoden Die beiden Methoden add der Klassen OhneGlobaleVar und MitGlobalerVar haben auf den ersten Blick exakt dieselbe Signatur, können aber anhand des (vorläufig) vollständigen Namens eindeutig unterschieden werden: OhneGlobaleVar.add MitGlobalerVar.add Statische Methoden und statische (globale) Variablen/Konstanten heißen auch Klassenmethoden bzw. Klassenvariablen/-konstanten. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 390 / 749

Zustände globaler Größen Wie passen globale Größen in unser Zustandsmodell? Wir müssen nur die Menge der Namen N(S) um die globalen Variablen und Konstanten erweitern, ansonsten werden sie behandelt wie lokale Variablen, d.h. die Semantik der Zustandsübergänge gilt analog. Einziger Unterschied: sie sind wirklich überall sichtbar/gültig, auch innerhalb des Rumpfes einer aufgerufenen Methode. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 391 / 749

Zustände globaler Größen Sind wirklich alle globalen Variablen/Konstanten immer bekannt (d.h. die entsprechenden Zettel existieren)? Es würde wenig Sinn machen alle Variablen/Konstanten aller Module, die es auf der Welt gibt, in N(S) aufzunehmen (was für eine Papierverschwendung!!!). Eine ähnliche Problematik ergibt sich übrigens bei den Methoden anderer Klassen. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 392 / 749

Zustände globaler Größen Tatsächlich muss man globale Größen und Methoden anderer Module (Klassen) explizit laden. Dies funktioniert in Java mit der Anweisung import, die wir in Zusammenhang mit Packages noch kennen lernen werden. Nur schon mal soviel: es gibt Module (aus der Standardbibliothek), die automatisch geladen werden (z.b. Math), sodass diese nicht explizit geladen werden müssen (d.h. deren Klassenvariablen/-konstanten stehen implizit zur Verfügung bzw. sind immer Teil von N(S)). Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 393 / 749

Vorsicht mit globalen Größen Achtung: Globale Variablen möglichst vermeiden, ansonsten nur, wenn sie in mehreren Methoden verwendet werden müssen ihr Wert zwischen Methodenaufrufen erhalten bleiben muss Wann immer möglich, lokale Variablen verwenden Einfachere Namenswahl Bessere Lesbarkeit: Deklaration und Verwendung der Variablen liegen nahe beieinander Keine Nebeneffekte: Lokale Variablen können nicht durch andere Methoden versehentlich überschrieben werden Peer Kröger (LMU München) Einführung in die Programmierung WS 16/17 394 / 749