Sichtbarkeiten, Klassenmember und -methoden

Ähnliche Dokumente
Polymorphie und UML Klassendiagramme

Teil 2: Weitere Aspekte der Objektorientierung

Implementieren von Klassen

Klassen können bekanntlich aus zwei Komponententypen bestehen, nämlich Attributen und Methoden.

Geschachtelte Klassen

Programmieren in Java

Javakurs für Anfänger

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmieren in Java

Vererbung. Prof. Dr.-Ing. Thomas Schwotzer

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Abstrakte Klassen und Interfaces

Geschachtelte Klassen

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

Java Einführung Methoden. Kapitel 6

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Das Interface-Konzept am Beispiel der Sprache Java

Wird in Java zwischen Gross- und Kleinschreibung unterschieden?

Wiederholung. Klassenhierarchie:

Allgemeines - Prinzipien

7. Übung Informatik II - Objektorientierte Programmierung

Programmierung Nachklausurtutorium

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

Programmieren in Java

Java Einführung Klassendefinitionen

Prozeduren vs. Funktionen

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

4. Vererbung Die Klasse Object. Die Klasse Object

Einführung in die Objektorientierte Programmierung Vorlesung 10: Zugriffskontrolle. Sebastian Küpper

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

Tag 4 Repetitorium Informatik (Java)

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

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

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Eindimensionale Arrays und Heap

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

Statische und Nichtstatische Methoden Properties/ Eigenschaften

10. Pakete. Ein Paket (package) bündelt thematisch zusammengehörige Klassen und Schnittstellen zu einer Klassenbibliothek.

Tag 7 Repetitorium Informatik (Java)

Allgemeine Informatik II SS :30-13:30 Uhr

Java: Vererbung. Teil 3: super()

Einstieg in die Informatik mit Java

Konstruktor/Destruktor

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Objektorientierte Programmierung Studiengang Medieninformatik

Java I Vorlesung Vererbung und Sichtbarkeit

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Einstieg in die Informatik mit Java

C++ Klassen weitere Funktionen

AuD-Tafelübung T-B5b

Humboldt-Universität zu Berlin Wintersemester 2010/11 Institut für Informatik Grundlagen der Programmierung. 6. Übungsblatt

7. Klassenmethoden Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Programmiertechnik Klassenvariablen & Instantiierung

Klassen und Konstruktoren in Java

Fragen zur OOP in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmieren in Java -Eingangstest-

Grundlagen der Informatik

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

M3 M4 M7 VORNAME: Nom-Kenner VERTIEFUNG: Ausdruck des vorab bekannt gemachten Quelltextes

Programmierkurs C++ Abstrakte Klassen und Methoden

Programmieren 1 08 Objekte und Interfaces

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

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Kapitel 10 Delegationsvariablen

2. Vererbung und Kapselung

Vorkurs Informatik WiSe 15/16

Propädeutikum Programmierung in der Bioinformatik

10.4 Konstante Objekte

11. Java Klassen. Klassen - Technisch. Klassen - Beispiel: Erdbebendaten. Klassen - Konzeptuell

Einführung in die Programmierung I. 10. Klassen und Objekte. Stefan Zimmer

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

Einstieg in die Informatik mit Java

Javakurs für Anfänger

Algorithmen und Datenstrukturen 06

Algorithmen und Datenstrukturen

Programmierkurs C/C++

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

Info B VL 11: Innere Klassen/Collections

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Programmieren in Java

Arten von Klassen-Beziehungen

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

2 Programmieren in Java I noch ohne Nachbearbeitung

Ein Vortrag im Rahmen des Wahlpflichtmoduls Fortgeschrittene Programmierung mit JAVA

14. Java Klassen. Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, statische Felder und Methoden, Datenkapselung

Einstieg in die Informatik mit Java

4. Objektorientierte Programmierung mit C++

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Programmierung und Angewandte Mathematik

Programmieren, Wintersemester 13/14 Übungsleiter: Sebastian Ebers Aufgabenblatt 5

Testgetriebene Entwicklung

Einstieg in die Informatik mit Java

Informatik I Eprog HS12

Tag 4 Repetitorium Informatik (Java)

OOP. Tagesprogramm. Beziehungen zwischen Typen Vererbung Sichtbarkeit

Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern

Transkript:

Sichtbarkeiten, Klassenmember und -methoden Prof. Dr.-Ing. Thomas Schwotzer 11. November 2017 1 Einführung Wir haben uns mit Klassen und Objekten beschäftigt. Wir wissen nun, dass Objekte anhand von Klassen erzeugt werden. Wir wissen, dass die Objekte die Daten halten und in den Klassen die Methoden implementiert werden. Methoden gelten für alle Objekte einer Klasse; die Daten gehören den Objekten. Das ist aber noch nicht alles. Man kann seit Java recht fein steuern, welche Klassen welche Methoden aufrufen können. Wir müssen Sichtbarkeiten diskutieren. Oft ist es sinnvoll Konstante zu definieren. Die Zahl π ist eine solche, die allgemein bekannt ist. In den meisten Programmen gibt es Werte, die für alle gelten. Die Regel don t repeat yourself erzwingt, dass man solche Werte einmal definiert und dann immer nutzt. Das sind Konstante. Los geht s: 2 Packages Wir können Klassen erzeugen. Der Code der Klassen steht in einem Verzeichnis. Wenn wir den Java-Compiler starten, dann per Parameter übergeben, wo sich der Quellcode der Klassen befindet. So fein, so gut. In Java gibt es ein weiteres Strukturierungsmittel: Packages. Packages beschränken Sichtbarkeitsbereiche und sie sind enorm einfach zu implementieren: package p1; class Class_A { void printsomething() { System.out.println("Willkommen in Class_A in package p1"); Der obige Code ist uns bereits vertraut. Der Unterschied besteht in der Packagedefinition. package p1; 1

Diese sagt, dass die Klasse zu dem Package gehört. Das bedeutet, dass der Quellcode der Klasse in einem Verzeichnis namens p1 stehen muss. Ansonsten beschwert sich der Compiler. Testen Sie das gern einmal. Schauen wir und folgende Definition an: package p2; class Class_A { void printsomething() { System.out.println("Willkommen in Class_A in package p2"); Wo ist der Unterschied? Nur die Packagedefinition hat sich geändert. Wir sind im Packagep2. Der Rest ist identisch. Wir haben etwas gelernt: Die Namen von Klassen sind in Java eindeutig - innerhalb eines Packages. Jedes Package ist sein eigener Namensraum. Wir können in jedem Package unsere Klassen so benennen wie wir wollen. Das ist gut. Jede nicht triviale Software hat Teilaufgaben, die sich inhaltlich trennen lassen. Packages sind dafür geschaffen worden, diesen Teilaufgaben, einen Raum zu geben. Schauen wir uns noch folgende Definition an: package p2; public class Class_B { void printsomething() { System.out.println("Willkommen in Class_B in package p2"); public void printsomethingelse() { System.out.println("Willkommen in Class_B in package p2 (Variante 2"); Abbildung 1 stellt die Situation dar. Wir implementieren nun einmal in den Klassen Class A jeweils die folgende main-methode: Class_A a = new Class_A(); // welche Klasse wird hier genutzt? Class_B b = new Class_B(); // in welchem Package funktioniert das? Ein Package ist eine abgeschlossene Einheit. Der Java-Compiler kennt alle Klassen eines Packages. In Package p2 wird daher der obige Code direkt compilieren. In Package p1 allerdings nicht. Dort gibt es keine Klasse Class B. Ändern wir daher die Implementierung in Package p1: Class_A a = new Class_A(); p2.class_b b = new p2.class_b(); 2

Abbildung 1: Packages p1 und p2 mit den Klassen A, und B Packages können explizit angegeben werden wie in diesem Fall. Das erfolgt sowohl in der Deklaration p2.class B b als auch beim Aufruf des Konstruktor: new p2.class B(). Eine Variante ist möglich und auch sehr üblich und zu empfehlen. Klassen können generell importiert werden, wenn es keine Klasse gleichen Namens in Package gibt: import p2.class_b; class Class_A { Class_A a = new Class_A(); Class_B b = new Class_B(); Class B im Quelltext der Klasse Class A wird nun sofort als die Klasse im Package p2 identifiziert. 3 Sichtbarkeiten Ändern wir noch einmal den Code von Class A in Package p1. import p2.class_b; class Class_A { Class_A a = new Class_A(); 3

Class_B b = new Class_B(); a.printsomething(); b.printsomething(); b.printsomethingelse(); p2.class_a = new p2.class_a(); Wir tippen diesen Code einmal ein und schauen uns die Fehlermeldungen an. Was sagen diese aus? Warum können wir die Methode printsomething auf b nicht aufrufen und warum können wir kein Objekt der Class A aus Package p2 erzeugen? Antwort: Sie sind nicht public. Schauen Sie sich die Implementierung der Klassen noch einmal genau an. Die Klasse Class B ist public deklariert, genau wie die Methode printsomethingelse(). Jede Klasse, Methode und jedes Member kann mit einer Sichtbarkeit deklariert werden. Für unsere Zwecke genügen drei (eine weitere (protected) kommt hinzu, wenn wir uns mit Vererbung beschäftigen. Ändern wir die Deklaration in B: package p2; /** Klasse B ist public: Kann in anderen Packages genutzt werden */ public class Class_B { // public.. kann außerhalb von Packages gerufen werden public void printsomethingelse() { System.out.println("Willkommen in Class_B in package p2 (Variante 2"); // default.. kann innerhalb von Packages gerufen werden void printsomething() { System.out.println("Willkommen in Class_B in package p2"); // private.. kann nur innerhalb der Klasse gerufen werden private void printsomethingprivat() { System.out.println("Willkommen"); public Der Aufruf ist von allen Klassen innerhalb des Programms möglich. Mit 4

dieser Sichtbarkeit muss man sehr vorsichtig umgehen. Es ist nicht gut, wenn all unsere Klassen und Methoden überall im Programm aufgerufen werden können. Das bedeutet nämlich auch, dass andere uns fragen könnten, was da eigentlich passiert. Die Dokumentation dieser Methoden muss sehr sehr gut sein. Sparen wir uns den Stress.. Im Ernst: Gehen Sie damit sparsam und bewusst um. default Wenn wir nichts vor die Methode etc. schreiben, gilt die Standardsichtbarkeit: Innerhalb des Packages kann auf die Methoden und Klassen zugegriffen werden. Es ist eine gute allgemeine Regel, dass wir diese Sichtbarkeit für Klassen wählen und für die meisten unserer Methoden. private Der Aufruf dieser Methoden und Member ist nur innerhalb der Klasse möglich. Das ist gut! Methoden, die private sind, können nur wir aufrufen. Kein anderer kann von um Erklärung bitten, was da konkret passiert. Weniger Dokumentation! Das ist tatsächlich Ernst gemeint. Für Member gilt: Die sind private! Es muss enorm gute Gründe geben, ein Member nicht private zu deklarieren. Das wird schwerlich innerhalb der ersten zwei Semester passieren. Eine Ausnahme sind die Konstantendeklarationen. 4 Konstante In dem meisten nicht-trivialen Programmen existieren Konstante. Das mögen Werte sein, mit denen Objekte initialisiert werden. Das mögen Werte sein, um die irgendein Wert erhöht wird nach irgendeinem Durchlauf oder auch Höchstwerte bis zu denen irgend etwas berechnet wird. Es gibt keine Schlüsselwort Konstante in Java wie in C++. Es gibt aber eine Kombination von zwei Deklarationen, die den gleichen Zweck erfüllen: package p2; /** Klasse B ist public: Kann in anderen Packages genutzt werden */ public class Class_B { public static final int THE_ANSWER = 42; Wir klären das: static deklariert dass ein Member oder eine Methode für die gesamte Klasse unabhängig von den Objekten gilt. final deklariert, dass dieser Member nicht mehr verändert werden kann. Er ist damit eine Konstante. Die Kombination von beiden sieht man weiter oben. THE ANSWER ist static und damit auch gültig, wenn kein Objekt erzeugt wurde. Die Variable ist aber auch final. Sie kann nicht verändert werden. 5

Außerdem wurde sie public deklariert. Sie ist damit von überall erreichbar. Regel: Konstanten-Bezeichner schreibt man mit GROSSBUCH- STABEN. Punkt. Man kann nun in jeder Methode des Programm schreiben: import p2.class_b;. int value = p2.class_b.the_answer; // wegen import geht auch value = Class_B.THE_ANSWER; // geht auch das? Testen Sie! value = THE_ANSWER; static Member existieren ohne Objekt. Sie sind aber eine Klasse zugeordnet. Damit kann man sie explizit adressieren über den Namen des Packages und der Klasse. Mit den Import-Regeln kann man diese Schreibweise verkürzen. Regel: Lange Schreibweisen sind gut. Wir müssen die nicht vermeiden. Das Programm ist dadurch lesbarer - es gibt weniger Unklarheiten. Aber wo wir schon bei static sind können wir auch die ganze Wahrheit erzählen. 5 Klassenmember und -methoden Methoden und Member können static deklariert werden. Was bedeutet das? 5.1 Klassenmember Ein static Member wird Klassenmember genannt. Hier ist die Regel: Wir benutzen Klassenmember nur in Kombination mit final als Konstante. Ansonsten benutzen wir sie nicht. Jedenfalls nicht bevor wir uns ernsthaft mit Design Pattern auseinander gesetzt haben. Mit ernsthaft ist nicht und einmal rüber-googeln gemeint. Damit ist gemeint, dass wir die Klausur in Komponentenbasierter Entwicklung als freudiges Erlebnis kaum noch erwarten können. Wenn wir so weit sind, dann denken wir noch einmal über Klassenmember nach. Vorher: Finger weg! Aber man sollte wissen, wie es geht. class X { private static int classmember = 0; private int member = 0; X x1 = new X(); 6

System.out.println(x1.classMember + "/" + x1.member); x1.classmember++; x1.member++; System.out.println(x1.classMember + "/" + x1.member); // das brachte wenig Überraschungen X x2 = new X(); // neues Objekt.. neue Daten? System.out.println(x2.classMember + "/" + x2.member); // interessant, oder? /* Man schreibt zwar x2.classmember, aber das ist identisch mit x1.classmemmber oder auch: */ System.out.println(X.classMember); Wir diskutieren das in der SU. Fazit: Üben Sie einmal wie das geht und dann benutzen Sie es nie wieder. Konstante sind gut. Klassenmember sind schrecklich. 5.2 Klassenmethoden Sie kennen bereits eine Klassenmethode, die wir ständig einsetzen. Die main(). Methoden können mit static deklariert werden. In dem Moment sind sie aufrufbar ohne Objekt. Das muss man sich auf der Zunge zergehen lassen: Wir haben eine objektorientierte Sprache. Die Daten werden in Objekten gespeichert und dort verarbeitet. Nun haben wir aber eine Chance, das gesamte Konzept zu umgehen. Wir brauchen keine Objekte. Wir könnten nur mit statischen Methoden arbeiten. So haben wir auch mal gearbeitet früher. Sehr viel früher. Das Ergebnis bekam sogar ein Wort: Software-Crisis. Suche Sie mal danach. Und dann wiederholen wir gedanklich immer wieder: OO ist gut. Wir nutzen Objekte. Klassenmember sind schrecklich. Klassenmethoden sind schrecklich. OO ist gut. Wir nutzen Objekte. Es gibt bis auf weiteres nur einen guten Grund für eine Klassenmethode: Das ist die main(). Um ein Objekt zu erzeugen, muss eine Methode laufen. Die erste Methode eines Programms muss also starten bevor ein Objekt erzeugt wurde. Danach gibt es gar keinen Grund mehr, Klassenmethoden zu nutzen. Tun Sie es auch nicht. Es gibt einige wenige weitere gute Gründe für Klassenmethoden. Darüber sprechen wir in Software-Engineering oder Programmieren 3. Oder suchen Sie 7

einmal nach Factory Pattern oder Factory Method. Bis dahin: Üben wir das einmal und dann lassen wir die Finger davon. 8