JAVA & Objektorientiertes Programmieren

Eine Einführung in das objektorientierte Programmieren mit JAVA Diese Kartei baut auf dem Stoff des Moduls OOP an der HSLU geleitet von Roland Gisler auf.

Eine Einführung in das objektorientierte Programmieren mit JAVA Diese Kartei baut auf dem Stoff des Moduls OOP an der HSLU geleitet von Roland Gisler auf.


Set of flashcards Details

Flashcards 500
Students 19
Language Deutsch
Category Computer Science
Level University
Created / Updated 04.12.2016 / 16.08.2024
Weblink
https://card2brain.ch/box/java_objektorientiertes_programmieren
Embed
<iframe src="https://card2brain.ch/box/java_objektorientiertes_programmieren/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>

Was ist die natürliche Ordnung (Tipp: Comparable)

Eine Klasse implementiert das Interface Comparable und definiert damit eine einzige, natürliche Ordnung. Beispiel:
- Temperaturen nach Wert aufsteigend
- Namen alphabetisch aufsteigend: nach Nachname, Vorname

Was ist die spezielle Ordnung (Tipp: Comparable)

Wollen wir Objekte nach verschiedensten Kriterien sortieren, implementieren wir eigenständige, kleine Klassen, welche das Interface Comparator implementieren.

Jeder Komparator steht dann für eine spezielle Ordnung.

Welche Methoden spezifiziert das Interface Comparator?

int compare(T o1, T o2): Vergleicht zwei Objekte in analoger Semantik wie Comparable
boolean equals(Object obj): Soll so implementiert werden, dass Comparatoren mit gleicher Sortierlogik auch als "gleich" erkannt werden (für Optimierungen). Einer der seltenen Fälle, bei welchem es meist ausreicht, "nur" auf den Klassentyp zu vergleichen.

Wie sieht die Implementation des Interfaces Comparator für die Klasse Person aus?

(siehe Bild)

Was sind Datenstrukturen?

Datenstrukturen werden verwendet um Mengen von Daten bzw. Objekten effizient zu speichern und verarbeiten zu können.

Unter verarbeiten versteht man Funktionen wie z.B. alle enthaltenen Daten/Objekte einzeln zu bearbeiten, nach bestimmten Objekten zu suchen, zu zählen, zu filtern oder nach unterschiedlichen Kriterien zu sortieren etc.

Welche verschiedene Arten von Datenstrukturen gibt es?

Array - indexierte Reihung
Tree - hierarchisch geordnete Daten
List - einfache Reihung
Map - Zuordnung zwischen Schlüssel und Wert(-paaren)
Queue - (Warte-)Schlange, FIFO
Set - Sammlung ohne Duplikate
Stack - Stapel- oder Kellerspeicher, FILO

Gibt es eine universelle Datenstruktur die alles perfekt kann?

Nein leider nicht. Wir müssen fallspezifisch auswählen!

Die verschiedene Datenstrukturen unterscheiden sich in welchen Punkten?

Grösse: Dynamische oder statisch
Zugriff: Direktzugriff oder sequenziell
Sortierung: Sortiert oder unsortiert
Suche: Beschleunigte Suche (z.B. über Hashwert)
Geschwindigkeit: Grundlegende Operationen wie Einfügen, Anhängen, Entfernen, etc.

Aus was besteht das Java Collection Framework

Interfaces: Abstrakte Datentypen, welche verschiedenartige Datenstrukturen repräsentieren, und es erlauben Datenstrukturen unabhängig von ihrer konkreten Implementation zu verwenden (List<E> abstrahiert z.B. LinkedList<E> und ArrayList<E>)

Implementationen: Konkrete, wiederverwendbare Implementationen der durch Schnittstellen definierten Datenstrukturen (HashMap<K,V> ist z.B. eine Implementation von Map<K,V>)

Algorithmen: Methoden zur Bearbeitung von Datenstrukturen. Die Algorithmen sind polymorph implementiert und können somit auf verschiedene Datenstrukturen angewandt werden. (sort(List<E>) sortiert z.B. beliebige List-Implementationen)

Welche Vorteile bietet Java Collections Frameworks an?

Wiederverwendung (Datenstrukturen und Funktionalität nicht selbst implementieren)
Schnell und fehlerfrei
Austauschbarkeit (Erleichtert Austausch und Wiederverwendung unterschiedlicher Implementationen von Datenstrukturen)
Interoperabilität (vereinfacht Verständnis und Zusammenarbeit massiv)

Wie sieht eine abgespeckte UML der Java Collection Framework aus?

(siehe Bild)

Was ist der Unterschied einer Deque<E> zu einer Queue<E>?

Deque<E> (double ended queue) ist eine spezielle Queue mit zusätzlichen Methoden!

Die Klasse Collections bietet z.B. verschiedene, polymorph implementierte Methoden zur Bearbeitung von Sammlungen an. Nenne ein paar Beispiele.

sort(...) - Schnelles, stabiles sortieren
shuffling(...) - Randomisieren der Reihenfolge
reverse(...) - Dreht die Ordnung einer List um
fill(...) - Füllt eine Liste mit bestimmten Elementen
- copy(...) - Kopiert eine Liste in eine andere Liste
swap(...) - Tauscht die Plätze von zwei Listenelementen
min(...)/max(...) - Liefert das kleinste/grösste Element
frequency(...) - Zählt ein bestimmtes Element in der Liste

Wichtiger Hinweis: Nicht alle Funktionen sin für alle möglichen Arten von Datenstrukturen möglich implementiert!

Damit die polymorphen Algorithmen und Datenstrukturen des Collection Frameworks mit beliebigen Elementen funktionieren können, benötigen wir welche grundlegende Funktionen?

Wie werden diese Funktionen ermöglicht?

- Für die Suche von Objekten (oder Verhindern von Duplikaten) müssen wir Objekte als gleich erkennen können
- Für die Sortierung müssen wir Objekte vergleichen und als kleiner oder grösser beurteilen können

Die Klasse definiert dafür die Methoden equals() und hashCode(). Es gibt auch die Interfaces Comparable<T> oder Comparator<T>

Was sind die Merkmale einer ArrayList<E>?

Generisch implementierte Klasse
Dynamisch: Die Grösse einer ArrayList pass sich automatisch an
Geordnet: Elemente sind geordnet abgelegt. Behalten ihre Ordnung, aber nicht automatisch sortiert!
Direktzugriff: Auf einzelne Elemente kann mittels der Methode get(int index) direkt zugegriffen werden. Index im Bereich 0..size()-1

Wie sieht die ArrayList im Einsatz aus?

(siehe Bild)

Wie kann man ungefähr entscheiden welche Datenstruktur am besten geeignet ist für den benötigten Fall?

Mit dem Entscheidungsbaum (siehe Bild) als erste grobe Richtschnur

Auf was kann das Schlüsselwort static angewendet werden?

Auf Attribute und Methoden

Was kann man mit statischen (static) Elementen machen?

Statische Elemente können direkt über die Klasse referenziert und verwendet werden, ohne dass ein Objekt existiert. Sie existieren dann aber pro Klasse auch nur genau einmal!

Wie werden statische (static) Elemente im UML dargestellt?

unterstrichen

(siehe Bild)

Was muss man beachten bei der Implementation eines statischen Attributs?

Ein statisch deklariertes Attribut existiert nur genau einmal pro Klasse, und nicht n-mal (pro Objekt)

Was ist der häufigste Anwendungsfall eines statischen Attributs?

Ein statisches Attribut, welches gleichzeitig finalisiert (final) ist und als Konstante dient.
Konstanten werden mit GROSSEN_BUCHSTABEN bezeichnet. Beispiel:

public static final double KELVIN_OFFSET = 273.15d;

Wie werden statische Attribute referenziert

Über den Klassennamen (entsprechende Sichtbarkeit vorausgesetzt)
Beispiel:

double value = Temperatur.KELVIN_OFFSET;

Was ist ein Hauptvorteil einer statischen (static) Methode?

Eine statische Methode kann direkt auf einer Klasse aufgerufen werden, ohne dass ein Objekt existiert.

Wann sind statische Methoden sinnvoll?

Wenn eine Funktion stateless, d.h. unabhängig von Attributwerten ist.
Beispiel:

public static double convertCelsiusToKelvin(double celsius) {...}

Wie werden statische (static) Methoden referenziert?

Über den Klassennamen (Sichtbarkeit vorausgesetzt)
Beispiel:

double kelvin = Temperatur.convertCelsiusToKelvin(20.0);

Welche statische (static) sind relativ bekannt?

System.out.println(...)
Math.PI oder Math.E

Ist die main()-Methode statisch (static)?

Ja, public static void main(String[] args) {...}
Die main()-Methode repräsentiert den Eintrittspunkt für den Start einer Klasse bzw. einer ganzen Java-Applikation! (Löst das "Huhn oder Ei"-Problem, zumindest für Java).

Wo kann das Schlüsselwort final eingesetzt werden?

bei, lokalen Variablen, formalen ParameternAttributenMethodenKlassen

Hat je nach Einsatzort eine unterschiedliche Bedeutung!
Der Stereotyp <<leaf>> (analog zu <<interface>>) signalisiert, dass eine Klasse final deklariert ist

Was bewirkt das Schlüsselwort final bei lokalen Variablen?

Dass der einer Variable (z.B. final int count = students.size();) nur genau einmal ein Wert zugewiesen werden kann (Wert ist nicht mehr veränderbar!)

Was ist der Zweck des Schlüsselwortes final bei lokalen Variablen?

Man bewirkt damit, dass der Wert nach der initialen Zuweisung konstant bleibt -> Programmierstil. Bewahrt bei späteren Codeänderungen evt. vor Fehlern!

Was bewirkt das Schlüsselwort final bei formalen Parametern?

Dass der als aktuelle Parameter übergebene Wert innerhalb der Methode nicht überschrieben werden kann

Was ist der Zweck des Schlüsselwortes final bei formalen Parametern?

Dass der Parameter innerhalb der Methode konstant bleibt -> Programmiertstil.

Man hat die Sicherheit, dass der Originalwert in der ganzen Methode zur Verfügung steht
Bewahrt bei späteren Codeerweiterungen evt. vor Fehlern.

Was muss man bei finalen (final) Attributen beachten?

Man kann ihnen nur einmal einen Wert zuweisen und zwar direkt bei der Deklaration (seltener), oder einmalig innerhalb eines Konstruktors (häufiger)

Was ist der Zweck von finalen (final) Attributen?

Sie sind die Grundlage für immutable Klassen.
Beispiel: User-Klasse mit uidname und vorname, als Attribute.
Die uid wird bei der Erstellung festgelegt und ist danach unveränderlich, während Namen und Vornamen noch mutiert werden können

Sind finalisierte Attribute ein MUSS?

Nein, sie sind ein essentieller Designentscheid!

Können finalisierte Methoden in allfälligen Spezialisierungen überschrieben werden?

Nein

Was ist der Zweck von finalisierten Methoden?

Damit schützt man Methoden in Vererbungshierarchien vor dem (absichtlich oder unabsichtlichen) überschreiben

Was sind typische Beispiele bzw. Situationen für finalisierte Methoden?

- einfache Setter- und Getter-Methoden können finalisiert werden
- (Fertig) implementierte Methoden auf (teil-)abstrakten Klassen

Finalisierte Methoden sind essentieller Designentscheid!

Kann man Klassen finalisiert werden und wie werden diese deklariert?

Ja: public final class Temperatur {...}