Hagen_1618_01 Flashcards
(36 cards)
In welche Gruppen können die Ausnahmesituationen („Exceptions“), die in einem Programm im Allgemeinen auftreten können, eingeordnet werden?
- Ausnahmesituationen, die auf eine unvorsichtige Implementierungsarbeit hindeuten und die durch angemessene Überprüfungen vermieden werden können. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subklassen von RuntimeException
- Ausnahmesituationen, die nicht vorhergesehen und nicht ausgeschlossen werden können, die aber zur Laufzeit mit hoher Wahrscheinlichkeit auftreten können und gegen die die Anwendung daher robust sein sollte; wie z.B. beim Netzwerk- / Datei-Zugriff oder Verwendung von Benutzereingaben. Klassen, die diese Gruppe von Ausnahmen beschreiben sind Subklassen von Exception oder Subtypen von Throwable, jedoch nicht von RuntimeException oder Error.
- Ausnahmesituationen, die nicht vorhergesehen werden können, auf die das Programm selber jedoch auch keine Einflussmöglichkeit hat. Situationen dieser Art stehen in keinem Zusammenhang mit einer konkreten Methode, sondern können an beliebigen Programmstellen unvermittelt auftreten. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subtypen von Error.
Nennen Sie 2 Ihnen bekannte Ausnahmetypen aus der Java-Standardbibliothek, die aus verschiedenen der oben genannten Gruppen stammen, und ordnen Sie sie zu.
- NullPointerException (1) Durch defensives Programmieren kann diese Ausnahme vermieden werden.
- NumberFormatException (1) An den Stellen, an denen eine Zeichenkette in eine Zahl gewandelt werden soll, kann durch eine syntaktische Prüfung zuvor sichergestellt werden, dass die Konvertierung tatsächlich durchgeführt werden kann.
- FileNotFoundException (2) Da auch andere Programme Zugriff auf das Dateisystem haben, kann nicht ausgeschlossen werden, dass Dateien verändert oder gar gelöscht werden, nachdem sich das Programm ihrer Existenz vergewissert hat. Wann immer Dateien geladen werden sollen (deren Pfad z.B. aus einer Konfigurationsdatei gelesen wird), muss damit gerechnet werden, dass die Datei nicht mehr gefunden werden kann.
- IOException (2) (z.B. bei Netzwerkkommunikation) Findet ein Nachrichtenaustausch zwischen verschiedenen Rechnern statt, muss damit gerechnet werden, dass die Verbindung aufgrund eines Netzwerkproblems gestört wird.
- OutOfMemoryError (3) Während der Programmausführung wird weiterer Speicher benötigt, der aber nicht zur Verfügung gestellt werden kann. Der zur Verfügung stehende Speicher wird durch den Benutzer beim Start der Anwendung beschränkt und kann durch das Programm selber nicht geändert werden.
Welche vier Arten von Polymorphie kennen Sie?
- Subtyp-Polymorphie
- parametrische Polymorphie
- beschränkt parametrische Polymorphie (hierbei handelt es sich um eine spezielle Form der parametrischen Polymorphie)
- Ad-hoc Poly-morphie
Was ist Subtyp-Polymorphie?
Subtyp-Polymorphie wird durch Subtyping erreicht. Das bedeutet, dass an den Stellen, an denen ein Objekt vom Typ Typ erwartet wird, auch Objekte beliebiger Typen Subtyp stehen dürfen, sofern diese Subtypen von Typ sind.
Was ist Parametrische Polymorphie?
Parametrische Polymorphie wird dadurch realisiert, dass bestimmte Konstrukte einer Programmiersprache – z.B. Methoden oder Klassen – durch Typparameter parametrisiert werden. Bei der Verwendung eines so parametrisierten Konstrukts wird der Typparameter durch einen konkreten Typen ersetzt. So ist es möglich, eine generische Implementierung einer Funktionalität anzugeben, die in verschiedenen Kontexten typsicher genutzt werden kann.
Was ist beschränkt parametrische Polymorphie?
Die beschränkt parametrische Polymorphie begegnet dem Problem der (einfachen) parametrischen Polymorphie, dass innerhalb der generischen Klasse keine Informationen über den Typen, mit dem der Typparameter belegt wird, zur Verfügung stehen. Hierin können so ohne eine explizite Typkonvertierung (Type Casts) keine spezifischen Methoden verwendet werden.
Durch die Angabe einer Schranke zu dem Typparameter kann nun hingegen festgelegt werden, dass dieser lediglich durch Subtypen der Schranke belegt werden kann. So kann auch ohne Typkonvertierung (Type Cast) innerhalb der generischen Implementierung auf die durch die Schranke deklarierte Schnittstelle zugegriffen werden.
Was ist Ad-hoc Polymorphie?
Als Ad-hoc Polymorphie wird das Überladen von Operatoren bzw. Methodennamen bezeichnet. Für identifizierte Operationen können so für unterschiedliche Argumenttypen jeweils optimierte Implementierungen angegeben werden.
Welche Kommunikationsarten von Prozessen kennen Sie? Was zeichnet sie jeweils aus?
Eine synchrone Kommunikation zweier Prozesse kann nur dann stattfinden, wenn beide Prozesse zueinander passende Programmstellen erreicht haben. Gegebenenfalls muss der eine Prozess zunächst auf den anderen warten.
Bei asynchroner Kommunikation führen die Prozesse die Aktionen zur Kommunikation aus und arbeiten danach weiter, ohne auf eine Antwort zu warten.
Nennen Sie vier Kommunikationsmittel und ordnen Sie sie den Kommunikationsarten von oben zu.
Kommunikationsmittel zur asynchronen Kommunikation:
- Kommunikation über gemeinsamen Speicher
- Kommunikation über Nachrichten
Kommunikationsmittel zur synchronen Kommunikation:
- Entfernter Prozedur- bzw. Methodenaufruf
- Spezielle Kommunikationskonstrukte (z.B. Entries in der Sprache Ada)
In welchem Kontext werden anonyme Klassen in Java häufig verwendet? Warum eignen sie sich hier besonders gut?
Anonyme Klassen werden oft im Rahmen der Entwicklung von grafischen Benutzeroberflächen verwendet, z.B. um Beobachter-Objekte an Bedienelementen zu registrieren. Hierzu eignen sie sich besonders gut, da von einem Beobachter-Objekt, welches ein spezifisches Verhalten implementiert, in der Regel nur ein einziges Objekt benötigt wird.
Welche Gemeinsamkeiten und welche wesentlichen Unterschiede bestehen zwischen einer lokalen und einer anonymen Klasse?
Sowohl lokale als auch anonyme Klassen können nur in Anweisungsblöcken, also z.B. im Rumpf einer Methode, deklariert werden. Beide sind damit auch innere Klassen, die Komponenten einer umschließenden Klasse darstellen.
Gegenüber einer anonymen Klasse hat eine „einfache“ lokale Klasse einen Namen, sodass von ihr mehrere Instanzen erzeugt werden können. Aus gleichem Grund können auch Variablen mit ihr typisiert werden, was einen Aufruf neu deklarierter Methoden von außen erlaubt.
Wodurch zeichnen sich Programmgerüste aus? Nennen Sie die wesentlichen Merkmale und erläutern Sie sie anhand eines Ihnen bekannten Beispiels.
(Abs. 5.1) Ein Programmgerüst ist ein erweiterbares und anpassbares System von Klassen, das für einen allgemeinen, übergeordneten Aufgabenbereich eine Kernfunktionalität mit entsprechenden Bausteinen bereitstellt. Beispiel: Java AWT zur Gestaltung von Benutzeroberflächen (vgl. Abs. 5.2.2.5)
- „anpassbar“ Das AWT erlaubt die Anpassung der vordefinierten Komponenten, um z.B. die Darstellung auf dem Display des Benutzers oder das Verhalten der Komponenten anzupassen.
- „erweiterbar“ Das AWT erlaubt die Definition eigener Komponenten, die selbst bei der Implementierung verschiedener Benutzeroberflächen wiederverwendet werden können.
- „System von Klassen“ Die einzelnen Klassen des AWT sind eng miteinander gekoppelt. Um ihre eigene Aufgabe zu erledigen, müssen sie in der Regel viele Nachrichten mit Instanzen anderer Klassen austauschen, da sie von ihren Funktionalitäten abhängig sind.
- „allgemeiner, übergeordneter Aufgabenbereich“ Das AWT unterstützt die Implementierung von Benutzeroberflächen im Allgemeinen, ohne Details, z.B. zu ihrem Aufbau, festzulegen.
- „Kernfunktionalität“ Das AWT selbst bietet keine vordefinierte Benutzeroberfläche an, sondern lediglich die Bestandteile, um Elemente zu definieren, zu positionieren oder die Interaktion der Elemente festzulegen. Erst durch eine individuelle Konfiguration von Instanzen verschiedener Klassen entsteht eine darstellbare Benutzerschnittstelle.
Charakterisieren Sie jede der drei Komponente der MVC-Architektur
Model (Anwendungsschnittstelle): Die Schnittstelle zur Anwendung bietet Operationen an, die von dem Benutzer durch Interaktion mit der Programmoberfläche initiiert werden. Die Operationen lösen Reaktionen der Anwendungen (z.B. Berechnungen) aus und melden Zustandsänderungen an die Programmoberfläche.
View (Darstellung): Als „Darstellung“ bezeichnet man diejenigen Komponenten der Oberfläche, durch die der Benutzer die Anwendung steuert (in die er also Werte einträgt oder sie anklickt) oder informationen über ihren Zustand erhält.
Controller (Steuerung): Die Komponenten, die als „Controller“ bezeichnet werden, steuern die Interaktion zwischen den Komponenten der Programmoberfläche und der Anwendungsschnittstelle. Sie reagieren auf Ereignisse, die durch die Benutzerinteraktion mit der Oberfläche ausgelöst werden und rufen entsprechende Operationen der Anwendungsschnittstelle auf. Bei Bedarf aktualisieren sie die Programmoberfläche, um den aktuellen Status der Anwendung korrekt zu repräsentieren.
Aus welchen Elementen kann eine Interface-Deklaration bestehen?
- (teilweise optionale) Zugriffsmodifikatoren;
- Name des Interfaces;
- eine optionale Liste von Typparametern, ggf. mit Schranken;
- eine optionale Liste von Namen von Interfaces (als Supertypen), die dieses Interfaces erweitert;
- benannte Konstanten, d.h. final deklarierte statische Felder;
- erweiterte Methodensignaturen, die durch Klassen, die dieses Interface als Supertyp deklarieren, implementiert werden müssen.
Einer Ihrer Kollegen sagt Ihnen: „Interfaces in Java sind überflüssig. Statt ihnen könnte man in Java genauso abstrakte Klassen verwenden.“ Was sagen Sie dazu? Begründen Sie!
Zwar ist es möglich, abstrakte Klassen zur Deklaration der öffentlichen Schnittstelle von Objekten zu verwenden; allerdings erlaubt Java aufgrund der fehlenden Mehrfachvererbung nicht, zu einer Klasse mehrere (abstrakte) Superklassen zu spezifizieren. In der Konsequenz könnte jede Klasse nur einen direkten Supertyp haben. Dahingegen können zu einer Klasse mehrere Interfaces als Supertypen spezifiziert werden, sodass eine Klasse auch mehrere direkte Supertypen haben kann.
Warum muss die main-Methode als Klassenmethode (also mit dem Schlüsselwort static) deklariert werden?
(vgl. Abschnitt 2.1.2; Seite 82) Beim Start eines Java-Programms existieren zunächst keinerlei Objekte. Die Existenz eines Empfängerobjekts ist aber Voraussetzung, um eine Instanzmethode (also eine nicht-statische Methode) der jeweiligen Klasse aufzurufen. Eine statische Methode hingegen kann auch ohne Empfängerobjekt aufgerufen werden und steht damit sofort beim Start des Programms zum Aufruf zur Verfügung.
Warum ist das Schlüsselwort void notwendig?
(vgl. Abschnitt 1.3.3) Eine main-Methode darf keinen Rückgabewert haben. An die Stelle des Ergebnis-typs tritt dann das Schlüsselwort void.
* (Hinweis: Dass eine main(.)-Methode keinen Rückgabewert haben darf, kann man sich leicht erklären – denn was sollte mit einem solchen Rückgabewert passieren?*
Der Aufrufer der Methode ist ja gewissermaßen, wenn auch über Umwege, das Betriebssystem, was mit einem Java-Objekt im Allgemeinen nichts anfangen kann. Um dem Betriebssystem zumindest eine Rückmeldung über den Erfolg einer Programmausführung zu geben, bieten die Exit-Codes die Möglichkeit, sein Ergebnis bei Terminierung als ganze Zahl zu codieren. Andere Sprachen, z.B. C oder C++, erlauben als Rückgabetyp der main-Methode daher auch den Typ Integer. In Java kann ein Programm seinen Exit-Code lediglich durch seine explizite Beendigung mit Hilfe der Methode System.exit(int) als Parameter angeben.)
Wozu dient der Parameter args? Warum ist er mit einem String-Array typisiert?
(vgl. Abschnitt 1.3.3) Beim Start eines Java-Programms mit Hilfe des Betriebssystems können dem Programm eine beliebige Anzahl von Argumenten (Programmparameter) übergeben werden. Jedes Argument besteht aus einer Zeichenkette und wird über die entsprechende Stelle des Arrays verfügbar gemacht.
Aus welchen Einheiten besteht ein Java-Programm und woher können Sie stammen?
Ein Java Programm besteht aus einer Menge von Klassen. Diese können einerseits benutzergeschriebenen Klassen, andererseits Bibliotheksklassen sein.
Welche Möglichkeiten gibt es, diese Einheiten (Klassen) zu organisieren? Welche Vorteile hat eine sorgfältige Organisation dieser Einheiten?
In Java können Klassen in sogenannten Paketen organisiert werden. Jedes Paket besitzt einen eindeutigen Namen und enthält Übersetzungseinheiten, die jeweils einer Datei mit der Namenserweiterung java entsprechen. Eine geeignete Organisation der Klassen bietet die folgenden Vorteile:
1. Erleichterung des Verständnisses von und der Orientierung in der Implementierung des Softwaresystems.
- Verbesserung der Wartbarkeit, indem eine Organisation gewählt wird, die die Abhängigkeiten der Klassen widerspiegelt.
- Steuerung der Zugriffsrechte, indem der Zugriff auf Einheiten eines Pakets aus anderen Paketen heraus durch die gezielte Definition von Sichtbarkeiten unterbunden wird.
- Getrennte Übersetzbarkeit von Teilmengen der Einheiten, aus denen das Softwaresystem besteht.
Wozu dienen Interfaces?
Durch ein Interface kann eine öffentliche Schnittstelle als Typ definiert werden. Klassen können Interfaces als Supertypen angeben und damit zusagen, dass ihre Instanzen diese Schnittstelle bedienen können.
Wozu dienen abstrakte Klassen?
Abstrakte Klassen dienen dazu, von mehreren Subtypen gemeinsam genutzte Teile der Implementierung an einer Stelle zusammenzufassen und Programme dadurch pflegeleichter zu machen.
Wieso erlaubt der Java-Compiler es nicht, eine Methode einer abstrakten Klasse sowohl abstract als auch private zu deklarieren?
Eine Methode, welche abstract deklariert ist, verfügt über keine Implementierung. Durch ihre Deklaration wird gewissermaßen bekannt gegeben, dass eine Methode mit dieser Signatur auf dem Objekt aufgerufen werden kann.
Welcher Code beim Aufruf ausgeführt werden soll, ist jedoch nicht definiert und muss erst in den Subklassen festgelegt werden. Dies geschieht, indem die abstrakte Methodendeklaration überschrieben und eine Implementierung angegeben wird. Methoden, welche private deklariert sind, sind jedoch in den Subklassen nicht sichtbar, sodass sie insbesondere auch nicht zum Überschreiben zur Verfügung stehen. Für abstract deklarierten Methoden mit private Sichtbarkeit könnte so niemals eine Implementierung angegeben werden und die abstrakte Klasse wäre nutzlos.
Anstatt eines Interfaces könnte man auch eine abstrakte Klasse deklarieren, in der alle Methoden öffentlich und abstrakt sind. Wieso kann man in Java auf Interfaces dennoch nicht verzichten?
Zu jeder Klasse kann jeweils nur genau eine Superklasse angegeben werden. Ohne Interfaces könnte eine Klasse so lediglich einen einzigen direkten Supertyp haben. Dies bedeutet jedoch eine zu starke Einschränkung für die Entwicklung großer Softwaresysteme.
Durch Interfaces ist es hingegen möglich, zu jeder Klasse mehrere Supertypen anzugeben, sodass Instanzen einer Klasse gleichzeitig mehrere Supertypen haben können, die selbst in keiner Subtypbeziehung zueinander stehen. Damit stellen sie eine wichtige Voraussetzung für die Umsetzung von Polymorphie in Java dar.
