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