10 - Klassen und Objekte Flashcards
Was sind Klassen? Wie werden sie deklariert?
Klassen sind zusammengesetzte Datentypen, die mehrere Elemente zusammenfassen. Sie können Variablen unterschiedlicher Datentypen kombinieren.
Deklaration:
class Date {
int day;
String month;
int year;
}
->day, month und year sind Attribute/Member-Variablen
Wie bei jedem Datentyp, kann man Variablen von einer Klasse deklarieren. Wie?
neue Variable (neues Objekt) der Klasse anlegen:
Date today = new Date();
Daten eingeben:
today.day = 1;
today.month = “Februar”;
today.year = 2024;
->es können beliebig viele Objekte einer Klasse erzeugt werden (allerdings durch Heap-Speicher begrenzt)
Was gibt eine Klasse vor?
Eine Klasse ist eine Schablone für Objekte. Sie gibt die Struktur der Objekte vor (z.B.: Bruch muss Zähler und Nenner haben).
Wie funktioniert die Speicherverwaltung von Objekten?
Objekte werden mit new erzeugt, wodurch im Heap Speicherplatz reserviert wird und der Variable eine Referenz zugewiesen wird. Zeigt keine Variable mehr auf ein Objekt (null), wird der Garbage Collector den Speicher automatisch wieder freigeben.
Was sind Heap und Stack?
Der Heap ist ein dynamischer Speicher, der für dynamische Speicherallokation verwendet wird (mit new; Objekte und Arrays hier -> Variablen am Stack). Der Zugriff erfolgt etwas langsamer als beim Stack, allerdings ist die Lebensdauer der Daten nicht auf den Block/die Methode begrenzt.
Der Stack ist ein Stapelspeicher und wird für lokale Variablen, Parameter usw. verwendet. Er wächst mit einem Methodenaufruf und schrumpft nach Beenden der Methode wieder (Variablen eher flüchtig). Der Zugriff erfolgt sehr schnell, wobei das LIFO-Prinzip gilt.
Wie kann man Objekte vergleichen?
Mit == kann man die Referenzen von Objekten vergleichen. Will man den Inhalt von Objekten vergleichen, muss man ihre Attribute vergleichen. Beispiel:
f1.numerator == f2.numerator
Wie hängen Objekte und Methoden zusammen?
Klassen können Methoden für ihre Objekte deklarieren. Diese “Instanzmethoden” können auf die Instanzvariablen des Objekts zugreifen.
Was sind Konstruktoren?
Konstruktoren sind spezielle Methoden zur Initialisierung des Objektes und werden beim Erzeugen des Objektes (mit new) aufgerufen. Sie haben denselben Namen wie die Klasse und man kann mehrere Konstruktoren (mit unterschiedlichen Parametern) deklarieren. Beispiel:
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
->this bezieht sich auf das Objekt, d.h. hier ist die Instanzvariable gemeint (oben; Namen der Parameter gleich, deshalb ist this notwendig)
Wann benötigt man Klassenmethoden und Klassenattribute?
Klassenmethoden und Klassenattribute benötigt man dann, wenn man Methoden oder Attribute nicht nur für Objekte, sondern für die Klasse definieren möchte. Man muss kein Objekt erzeugen, um sie zu verwenden, man kann direkt über den Klassennamen darauf zugreifen. Klassenmethoden und Klassenattribute existieren nur einmal (unabhängig von den Objekten).
Wie kann man ein Klassenattribut deklarieren?
Ein Klassenattribut wird mit dem Schlüsselwort static deklariert.
Beispiel:
static int fractionCounter = 0;
Zugriff von innerhalb der Klasse:
fractionCounter++;
Zugriff von außerhalb:
Fraction.fractionCounter;
->zählt, wie viele Brüche in der Klasse Fraction erzeugt werden, liefert Wert zurück
Wie kann eine Klassenmethode deklariert werden?
Eine Klassenmethode kann mit dem Schlüsselwort static deklariert werden.
Beispiel:
static void resetCounter() {
fractionCounter = 0;
}
->macht etwas, gibt nichts zurück
Was sind Factory-Methoden?
Factory-Methoden sind Methoden, die Objekte erzeugen und zurückgeben. Beispiel:
static Fraction getOneThird() {
return new Fraction(1, 3);
}
Was ist die main()-Methode?
Die main-Methode ist auch nur eine statische Methode der jeweiligen Klasse. Sie wird automatisch durch die JVM bei Programmstart aufgerufen.
Was sind Wrapper-Klassen (für primitive Datentypen)?
Wrapper packen Werte von primitiven Datentypen in Objekte (Autoboxing: Java verpackt/entpackt Werte automatisch). Beispiele dafür sind MAX_VALUE und MIN_VALUE. Primitive Datentypen sind byte, short, int, long, float, double, boolean und char.
Was sagen private, protected und public (und package private) über die Sichtbarkeit von Methoden und Attributen aus?
- private: Methode/Attribut ist außerhalb der Klasse nicht sichtbar, auch nicht in vererbten Klassen
- protected: außerhalb der Klasse nicht sichtbar, in vererbten Klassen sichtbar
- public: innerhalb und außerhalb der Klasse sichtbar
- package private: in anderen Klassen desselben Pakets sichtbar, auch in vererbten; nicht sichtbar in Klassen eines anderen Pakets, auch nicht in vererbten
Was ist Information Hiding (Geheimnisprinzip)?
Attribute, deren Werte kritisch sind (z.B. denominator = 0) und daher geprüft werden müssen (sonst fehlerhafter Programmablauf), sollten private sein. Um sie zu ändern und abzufragen, werden sogenannte Getter und Setter Methoden verwendet. Diese sind von außen sichtbar. Das wird als Kapseln von Daten bezeichnet. Man sollte bei Klassen niemals mehr öffentlich preisgeben, als unbedingt notwendig ist.
->man verwendet geschützte Memberattribute, aber öffentliche Getter und Setter Methoden
Können Klassen auch andere Klassen beinhalten?
Ja.
Wozu braucht man Vererbung?
Da Klassen Dinge der realen Welt modellieren und es diese Dinge oft in mehreren Varianten gibt, müssen Programme mit verschiedenen Varianten eines Objekts umgehen können. Diese Varianten kann man durch Klassifikation hierarchisch gliedern. Man möchte generelle Eigenschaften (Attribute) und Verhalten (Methoden) nicht ständig neu implementieren, sondern vererben können.
Wie funktioniert Vererbung in Java?
In Java verwendet man das Keyword extends hinter dem Klassennamen, um von EINER anderen Klasse zu erben (z.B.: class Reptil extends Tier). Die erbende (untere) Klasse nennt man Subklasse, die (obere) Klasse, von der vererbt wird, nennt man Superklasse. Die Subklasse erbt dabei Attribute und Methoden, sie kann Methoden der Superklasse allerdings auch überschreiben. In Java erbt jede Klasse von Object!
Was sind abstrakte Klassen?
Wenn man eine Superklasse nur als Vorlage für die Vererbung verwenden möchte, weil man z.B. kein Objekt dieser Klasse erstellt, dann kann sie auch als abstrakte Klasse definiert werden. Von einer abstrakten Klasse können keine Objekte erzeugt werden. Beispiel:
abstract class Article {…}
Was sind Interfaces (Schnittstellen)?
Interfaces sind ähnlich zu abstrakten Klassen, enthalten jedoch keine Attribute und keine Methodenrümpfe. Es handelt sich um Datentypen, die mit dem Keyword interface deklariert wurden. Sie definieren Methoden-Signaturen (alle öffentlich) und werden in einer Vererbungshierarchie verwendet (Keyword implements). Interfaces definieren keinen Konstruktor.