Declaration and Access Control
- Write code that declares, constructs and initializes arrays of any base type using any of the permitted forms, both for declaration and for initialization.
- Declare classes, inner classes, methods, instance variables static, variables and automatic (method local) variables, making appropriate use of all permitted modifiers (such as public final static abstract and so forth). State the significance of each of these modifiers both singly and in combination and state the effect of package relationships on declared items qualified by these modifiers.
- For a given class, determine if a default constructor will be created and if so state the prototype of that constructor.
- State the legal return types for any method given the declarations of all related methods in this or parent classes.
Write code that declares, constructs and initializes arrays of any base type using any of the permitted forms, both for declaration and for initialization.
Arrays sind geordnete Sammlung von Werten. Diese Werte können primitive Typen, Objekte oder auch wiederum Arrays sein. Alle Werte der Arrays müssen aber vom gleichen Typ sein.
Bei der Deklaration von Arrays können die eckigen Klammern vor dem Variablen oder auch dahinter platziert werden:
int a[];
oder
int[] a;
Arrays werden mit dem Schlüsselwort new erzeugt. Sie müssen aber nicht initialisiert werden:
int[] a = new int[10];
Bei der Erzeugung müssen Sie angeben, wieviele Werte dieses Array enthalten soll. Ein einmal erzeugtes Array kann nicht vergrössert oder verkleinert werden. Im oberen Beispiel werden in diesem Array 10 Integerwerte gespeichert.
Ausserdem wird das Array mit dem Defaultwert initialisiert:
Typ vom Element | Wert |
byte | 0 |
short | 0 |
char | '\u0000' |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
boolean | false |
Objekt | null |
Die Arrays können auch bei der Erzeugung mit Werten initialisiert werden:
int a[] = new int{10,20,30,40,50};
Hier wird ein Array mit 5 Werten erzeugt.
Die Grösse des Arrays erhält man mit length. Beispiel: a.length gibt 5 zurück. Indices der Arrays fangen mit 0 an und der Datentyp von Index ist int. Mehrdimensionale Arrays werden wie eindimensionale Arrays erzeugt, mit dem Unterschied, dass hier zwei paar eckige Klammern sind:
int a[][];
int[] a[];
int[][] a;
// deklariert drei 2-dimensionale Arrays vom Typ long.
long[][] var1, var2, var3;
Declare classes, inner classes, methods, instance variables static, variables and automatic (method local) variables, making appropriate use of all permitted modifiers (such as public final static abstract and so forth). State the significance of each of these modifiers both singly and in combination and state the effect of package relationships on declared items qualified by these modifiers
Um die Sichtbarkeit der Klassen, Methoden oder Variablen zu bestimmen, werden die Modifizierer(Bezeichner) verwendet.
public: Die Klasse ist ausserhalb des Pakets sichtbar, in dem sie definiert wurde. Die Methoden und die Variablen sind im Rahmen ihrer Lebensdauer überall sichtbar.
private: Methoden und Variablen sind nur in ihren Klassen sichtbar. Nicht mal die Subklassen haben Zugriff auf die Methoden und Variablen.
protected: Nur die Subklassen der protected-Klassen im gleichen Paket können auf Methoden und Variablen zugreifen.
default: Wenn kein Bezeichner angegeben ist, so wird es als default deklariert.Sie sind nur innerhalb des Pakets sichtbar, in dem sie definiert wurden. Ausserhalb ist auch Subklassen dieser Klasse der Zugriff nicht erlaubt.
Sichtbarkeit | public | protected | default | private |
innerhalb der selben Klasse | Ja | Ja | Ja | Ja |
Von einer Klasse im selben Paket | Ja | Ja | Ja | Nein |
Von einer Klasse außerhalb des Pakets | Ja | Nein | Nein | Nein |
Von einer Subklasse im selben Paket | Ja | Ja | Ja | Nein |
Von einer Subklasse außerhalb des Pakets | Ja | Ja | Nein | Nein |
abstract: Abstrakte Klassen dürfen nicht instanziiert werden. Die abgeleiteten Subklassen müssen die abstract-Methoden der Klasse implementieren. Eine Klasse muss als abstract definiert werden, wenn sie mindestens eine abstrakte Methode beinhaltet. Ferner kann aber eine Klasse abstract definiert werden, auch wenn sie keine abstrakte Methode beinhaltet. Abstrakte Methoden haben keine geschweiften Klammern. Sie werden mit ; abgeschlossen. Sie dürfen nicht zusammen mit final benutzt werden.
final: Die Klassen, die mit final definiert wurden, dürfen nicht abgeleitet werden. final-Methoden können von den Subklassen nicht überschrieben werden. final-Variablen können nicht verändert werden. Sie sind also Konstanten. Sie dürfen nicht zusammen mit abstract benutzt werden.
static: Diese Elemente existieren nur einmal. Ein mit static definiertes Element ist für alle Instanzen der Klasse zugreifbar, d.h. ändert eine Instanz den Wert dieses Elementes, so sehen alle anderen Instanzen den neuen Wert. Sie existieren vom Laden der Klasse bis zum Beenden des Programms. Mit static werden die klassenübergreifenden Konstanten definiert. Statische Methoden haben nur auf statische Variablen zugreifen. Sie haben kein this-Zeiger. Statische Initialisierungsblöcke werden ausgeführt, wenn die Klasse geladen wird. Sie können nicht überschrieben werden (A static method cannot be overriden to be non static in a child class). Aus nicht-statischen Methoden können durch Überschreiben keine statischen Methoden gemacht werden. Ferner können lokale Variablen nicht statisch deklariert werden.
native: Durch diesen Modifier Programmcode eingebunden werden, was in einer anderen Sprache geschrieben wurde. Sie werden mit einem Semikolon abgeschlossen und bestehen nur aus dem Methodenkopf.
transient: Diese Variablen werden beim Abspeichern des Zustandes eines Objekts nicht mit abgespeichert.
synchronized: wird angewendet bei Methoden, um sicherszustellen, dass eine Methode nie von zwei verschiedenen Threads gleichzeitig ausgeführt werden kann.
volatile: wird verwendet bei Programmen mit mehreren Threads. Alle Threads erhalten von der Variablen den korrekten Wert.
Modifizierer | Klasse | Methode | Variable |
final | Ja | Ja | Ja |
abstract | Ja | Ja | Ja |
static | Nein | Ja | Ja |
native | Nein | Ja | Nein |
transient | Nein | Nein | Ja |
volatile | Nein | Nein | Ja |
synchronized | Nein | Ja | Nein |
Innere Klassen
Es gibt vier verschiedene innere Klassen, die innerhalb einer anderen Klasse definiert werden. Sie werden auch als verschachtelte Klassen (nested classes) bezeichnet.
Statische Innere Klassen oder auch Statische Member Klassen
- Sie sind Klassen, die als Klassenmitglied einer anderen Klasse mit einem static-Bezeichner definiert sind.
- Sie können statische und nicht-statische Mitglieder haben.
- Sie verhalten sich wie eine normale Top-Level-Klasse
- Sie können nur von den statischen Membern der Klasse erreicht werden, die sie enthält
- Auch Interfaces können als statische Methoden definiert werden. Es gibt keine nicht-statische, lokale oder anonyme Interfaces.
- Eine nicht-statische innere Klasse wird ebenfalls als ein Mitglied einer umgebenden Klasse definiert, aber ohne den static-Bezeichner.
- Sie können keine statischen Mitgleider haben.
- Eine Instanz einer Memberklasse gehört immer zu einer Instanz der umgebenden Klasse, Sie muss also immer im Context mit der äusseren Instanz erzeugt werden.
- Sie können nicht den gleichen Namen haben, wie die umgebende Klasse.
- Sie können auf alle Elemente der umgebenden Klasse zugreifen, auch die privat-Elemente. Sie benötigen keine explizite Referenz.
- Sie werden definiert in einem Block. Dies kann sein: Methode, Konstruktor, lokaler Block, ein statischer oder ein Instanz-Initialisierer.
- Sie sind nur in diesem Block sichtbar. Ausserhalb dieses Blockes kann man nicht direkt zugreifen, da sie von ausserhalb dieses Blockes nicht sichtbar sind.
- Sie können keine static-Bezeichner haben. Wenn aber der Block, in dem sie sind, als statisch definiert wurde, so werden sie automatisch statisch. Anderenfalls sind sie nicht-statisch
- Sie haben Zugriff auf final-Variablen und final-Methoden bzw. Parameter innerhalb der Methode zugreifen.
- Eine anonyme Klasse ist eine Art lokale Klasse. Sie kombinieren Definition und Instantiierung in einem Schritt.
- Sie werden da definiert, wo sie benutzt werden.
- Sie haben keine expliziten Konstruktoren.
- Anonyme Klassen können nicht statisch sein. Wenn aber der Block, in dem sie sind, als statisch definiert wurde, so werden sie automatisch statisch.
- Interfaces können nicht anonym definiert werden. Aber anonyme Klassen können ein Interface implementieren.
- Bei den anonymen Klassen wird implizit von Object vererbt. Sie können auch von Klassen vererbt werden. Beides gleichzeitig ist nicht erlaubt.
Entity | Deklarations-kontext | Zugrifs bezeichner | benötigt äussere Instanz | Direkter Zugriff auf äusseren Kontext | static/non-static Mitglieder |
Klasse auf Paketebene | als Paketmitglied | public oder default | Nein | N/A | Beides |
statische innere Klasse (static) | statisches Klassenmitglied | Alle | Nein | statische Mitglieder im äusseren Kontext | Beides |
nicht-statische innere Klasse | nicht-statisches Klassenmitglied | Alle | Ja | Alle Mitglieder im äusseren Kontext | nur nicht-statische |
lokale Klasse (statisch) | in einem statischen Kontext | Keine | Nein | statische Mitglieder im äusseren Kontext und lokale, finale Variablen | nur nicht-statische |
lokale Klassen (nicht-statisch) | in einem nicht-statischen Kontext | Keine | Ja | alle Mitglieder im äusseren Kontext und lokale, finale Variablen | nur nicht-statische |
anonyme Klassen (nicht-statisch) | in einem nicht-statischen Kontext | keine | Ja | alle Mitglieder im äusseren Kontext und lokale, finale Variablen | nur nicht-statische |
anonyme Klassen (statisch) | in einem statischen Kontext | keine | Nein | statische Mitglieder im äusseren Kontext und lokale finale Variablen | nur nicht-statische |
Interface auf Paketebene | Paketmitglied | public und default | Nein | N/A | statische Variablen und nicht-statische Methodenprototypen |
For a given class, determine if a default constructor will be created and if so state the prototype of that constructor
- Konstruktoren sind besondere Methoden, die ausgeführt werden, wenn eine Klasse instanziiert wird.
- Sie haben den gleichen Namen wie der Klassen und haben keine Rückgabewerte.
- Konstruktoren werden benutzt, um bei der Instantiierung bestimmte Initialisierungen durchzuführen.
- In einer Klasse können mehrere Konstruktoren definiert werden, um z.B. verschiedene Initialisierungsmöglichkeiten zu haben. Diese unterscheiden sich durch Anzahl und Typ der Argumente. Der Compiler entscheidet dann welcher Konstruktor ausgeführt werden soll.
- Wird kein Konstruktor explizit definiert, so wird vom Compiler ein Default-Konstruktor erzeugt. Dieser Konstruktor hat eine leere Parameterliste und einen leeren Anweisungsblock.
- Wird aber mindestens ein Konstruktor definiert, so wird kein Default-Konstruktor erzeugt.
- Konstruktoren können nicht vererbt werden, und deshalb können sie auch nicht überschrieben werden.
- Konstruktoren können nicht native, abstract, static, synchronized or final sein.
- Alle Konstruktoren rufen den Default-Konstruktor der Elternklasse auf.
- Wenn kein Default-Kontruktor existiert, kommt Compilerfehler. Es sei denn, es wird explizit mit super(parameterliste) ein Konstruktor der Superklasse aufgerufen. Dabei muss dieser Aufruf als erstes im Konstruktor sein.
- Mit this(Parameterliste) kann auch ein anderer Konstruktor in der gleichen Klasse aufgerufen werden, dabei muss dieser Aufruf als erste Anweisung im Konstruktor sein.
- Die beiden Anweisungen super(...) und this(...) können nicht in einem Konstruktor verwendet werden.
- Ein Konstruktor kann sich nicht selbst aufrufen.
State the legal return types for any method given the declarations of all related methods in this or parent classes
Überladen (Overloading) bezeichnet man die Benutzung einer Methode mit dem gleichen Namen in der gleichen Klasse.Überschreiben (Overriding) bezeichnet man die Benutzung einer Methode mit dem gleichen Namen in der abgeleiteten Klasse.
Um zu unterscheiden, ob es sich um Überladung oder Überschreibung handelt, untersucht man die folgenden Merkmale (Signatur einer Methode):
- Name der Methode
- Parameterliste der Methode
- Rückgabewert der Methode
Bei der Überschreibung einer Methode müssen die Methoden den gleichen Namen, die gleichen Parameterwerte und den gleichen Rückgabewert haben. Kompilierungsfehler tritt auf, wenn sie den gleichen Namen und die gleichen Parameter haben, aber die Rückgabewerte sich unterscheiden.