Language Fundamentals
- Identify correctly constructed package declarations, import statements, class declarations (of all forms including inner classes) interface declarations, method declarations (including the main method that is used to start execution of a class), variable declarations, and identifiers.
- State the correspondence between index values in the argument array passed to a main method and command line arguments.
- Identify classes that correctly implement an interface where that interface is either java.lang.Runnable or a fully specified interface in the question.
- Identify all Java programming language keywords. Note: There will not be any questions regarding esoteric distinctions between keywords and manifest constants.
- State the effect of using a variable or array element of any kind when no explicit assignment has been made to it.
- State the range of all primitive formats, data types and declare literal values for String and all primitive types using all permitted formats bases and representations.
Identify correctly constructed package declarations, import statements, class declarations (of all forms including inner classes) interface declarations, method declarations (including the main method that is used to start execution of a class), variable declarations, and identifiers.
Ein Java-Code besteht aus einer Sammlung von Kompilierungseinheiten. Diese Kompilierungseinheiten sind eine package-Deklaration, import-Anweisung und Klassen oder Interface-Definition. In einer Datei müssen diese Einheiten in folgender Reihenfolge stehen:- package-Deklaration
- import-Anweisung
- Klassen- oder Interface-Definition
Package-Deklaration
Ein package wird wie folgt deklariert:
package packagename;
Packages können subpackages enthalten. Es ist so wie eine Verzeichnisstruktur aufgebaut. Wenn kein package-Name angegeben ist, so gehören die Klassen zur default-package. Es gibt bei der Angabe des package-Namens auch Konvetionen. Wenn der Domain-Name sagol.de ist, so fängt der package-Name mit de.sagol an. Dahinter kann man dann einen speziellen package-Namen angeben. In unserem Beispiel würde es dann so aussehen:
package de.sagol.meinpackage;
Es kann immer nur package deklariert werden. Vor der package-Deklaration können Kommentarzeilen vorhanden sein.
import-Anweisung:
Wenn man bestimmte Klassen in einem Code verwenden möchte, kann man diese Klassen importieren. Dazu benutzt man import-Anweisungen. Die Schreibweise sieht wie folgt aus:
import packagename.klassenname;
Hierbei wird diese Klasse zum Kompilieren geladen. Die folgende Schreibweise sorgt dafür, dass alle Klassen und Interfaces in einem package geladen werden:
import packagename.*;
Die Klassen und Interfaces in den Unterpaketen werden damit aber nicht geladen.
Klassendefinition:
Eine Klassendefinition sieht wie folgt aus:
Modifizierer class Klassenname extends Superklassenname implements Interfaces { Klassendefinition }Die beiden Anweisungen extends und implements sind keine Pflichtangaben. Mit der Anweisung implements kann man auch mehrere Interfaces implementieren, die mit Kommas getrennt werden.
Modifizierer können in irgendeiner Reihenfolge stehen. Die erlaubten Modifizierer sind:
- public
- abstract
- final
- strictfp
Der Modifizierer strictfp wurde in Java2 eingeführt. Dieser Modifizierer kann benutzt werden bei Klassen, Interfaces und Methoden. Er wird angewendet bei Fliesskommaoperationen, ist aber nicht Bestandteil der Java-Zertifikation.
Es ist nicht erlaubt, eine Klasse abstract und final zu deklarieren.
In den geschweiften Klammern können dann die folgenden Deklarationen stehen:
- Variablendeklaration
- Methodendeklaration
- Konstruktordeklaration
- Initialisierer
- statische Initialisierer
Initialisierer ist ein Block von Code, eingeschlossen in geschweiften Klammern, was nicht in einer Klassenmethode steht. Wenn eine Instanz einer Klasse gebildet wird, so werden zuerst alle Initialisierer ausgeführt, noch bevor der Konstruktor ausgeführt wird. Die Konstruktoren können somit die Variablen, die in den Initialisierern vorhanden sind, auf diese Variablen zugreifen.
statische Initialisierer:
Statische Initialisierer sind genauso aufgebaut wie die normalen Initialisierer, mit dem Unterschied, dass vor dem Namen das Schlüsselwort static steht. Die statischen Initialisierer werden ausgeführt, wenn die Klasse geladen wird. Die statischen Initialisierer haben Zugriff auf alle statischen Daten und Methoden einer Klasse.
Interfacedeklaration:
Eine Interfacedeklaration hat die folgende Form:
[public] [strictfp] interface interfacename [extends superinterfaces] { interface-Definition; }
- Die beiden Modifizierer public und strictfp sind optional.
- Im Gegensatz zur Klassendefinition kann ein Interface von mehreren Superinterfaces vererben. Hier müssen die Superinterfacenamen mit Komma getrennt werden.
- Eine Interfacedefinition kann mehrere Methoden und Konstanten haben.
- Alle Konstanten in einem Interface sind public static final.
- Alle Methoden sind public abstract
- Ein Interface hat keine Konstruktoren.
- Wenn eine Klasse ein oder mehrere Interfaces implementiert, muss sie alle Interface-Methoden als public erklärte Methoden implementieren. Wenn die Klasse diese Methoden nicht implementiert, dann muss diese Klasse als abstract deklariert werden.
- Eine Klasse, die ein Interface implementiert hat, kann auf alle Interfacekonstanten direkt zugreifen.
- Ein Interface ist überflüssig, wenn sie nicht von einer Klasse implementiert wird.
Abstract-Klassen und Interface
abstract-Klasse | Interface |
muss nicht intanziiert werden | muss instanziiert werden |
kann static und final-Daten enthalten | Variablen sind static und final |
abstract-Klassen können nicht-abstract-Methoden haben, aber wenn mindestens eine Methode abstract ist, so muss die Klasse als abstract deklariert werden. | Alle Methoden sind abstract. Deshalb müssen alle Methoden impliziert werden |
Abstract Methoden müssen nicht die Schlüsselwörter private, final, static, native, synchronized haben | Die Methoden in Interfaces müssen nicht die Schlüsselwörter protected, private, final, static, native, synchronized haben |
Methoden sind nicht unbedingt public | Methoden sind public, auch wenn sie nicht als public deklariert sind |
kann nur von einer Superklasse vererbt werden | kann mehrere Interfaces implementieren |
kann Konstruktor haben | dürfen keine Konstruktoren haben |
Methodendefinition
Eine Methode ist wie folgt aufgebaut:
[Modifizierer] Rückgabewert methodenname (Parameterliste) [throws exceptionliste]{ Methodenrumpf; }
- Die Angaben von Modifizierer und throws sind optional.
- Die erlaubten Modifizierer sind:
- Zugriffsmodifizierer (public, protected oder private)
- final
- static
- synchronized
- strictfp
- Wenn eine abstrakte Methode definiert wurde, so ist anstatt eines geschweiften Klammerpaares ein Semikolon zu setzen.
- Konstruktoren sind besondere Methoden. Hier sind die Namen der Konstruktoren die gleichen wie die Klassennamen und haben kein Rückgabewert.
- Die Reihenfolge der Methoden in einer Klasse kann freigewählt werden.
Die main()-Methode
Damit eine Klasse von der Java Virtual Machine gestartet werden kann, muss sie die main()-Methode haben. Sie ist sozusagen die Einstiegsmethode einer Klasse.
Die Javasprachen-Spezifikation besagt, eine main()-Methode muss public, static und void haben. Sie muss ein Array von String als Parameter aufnehmen. public bedeutet, die Methode ist zugreifbar von überall. static bedeutet, man auf sie Zugreifen ohne, dass sie instanziiert wird. void bedeutet, sie hat kein Rückgabewert.
Der Name des Arrays kann freigewählt werden. Im allgemeinen wird aber dieses Argument args[] oder argv[] benannt.
Mögliche Formen der main-Methode
- public static void main(String[] args){}
- static public void main(String[] args){}
- static public void main(String[] argv){}
- static public void main(String args[]){}
- public static void main(String[] a){}
- public static void main(String a[]){}
Eine Variable wird wie folgt deklariert:
[Modifizierer] variablenname [=Initialisierungswert;]
Modifizierer sind optional. Die folgenden Modifizierer für eine Variable sind erlaubt:
- Zugriffsmodifizierer (public, protected oder private
- final
- static
- transient
- volatile
State the correspondence between index values in the argument array passed to a main method and command line arguments.
Die main()-Methode ist der Einstiegspunkt von einer Anwendung. Wenn Sie eine Javaanwendung starten, wird zuerst eine Java Virtual Machine kreiiert. Die JVM lädt die Klasse, die Sie auf der Kommandozeile eingegeben haben, die wiederum ruft die main()-Methode auf. Der allgemeine Aufruf auf der Kommandozeile sieht wie folgt aus:
java Anwendungsklassenname Argument1 ... Argumentn
Der String-Array enthält dann die angegebenen Argumente. Die Wörter "java" und "Klassenname" sind nicht in dem Array vorhanden.
args[0] enthält das erste Argument, welches in der Kommandozeile übergeben wurde.
Eine Klasse, die keine main()-Methode hat, kann von der JVM aufgerufen werden, wenn eine ihrer Superklassen eine main()-Methode besitzt, die vererbt wurde.
Identify classes that correctly implement an interface where that interface is either java.lang.Runnable or a fully specified interface in the question.
In dem Interface java.lang.Runnable ist nur eine Methode, die in die Klasse implementiert werden muss:
public void run()
Diese Methode hat kein Rückgabewert und ist ohne Parameter aufzurufen.
Identify all Java programming language keywords. Note: There will not be any questions regarding esoteric distinctions between keywords and manifest constants.
Identifizierer- Ein Identifizierer ist der Name einer Klasse, einem Interface, einer Methode, einer Variablen oder einem Label.
- Ein Idenfizierer muss beginnen mit einem Buchstaben oder einem Dollarzeichen($) oder einem Unterstrich.
- In dem Namen können Buchstaben, Dollarzeichen, Unterstrich oder Zahlen vorhanden sein
- Identifizierer sind "case sensitive"
abstract | do | implements | protected | throws |
boolean | double | import | public | transient |
break | else | instanceof | return | true |
byte | extends | int | short | try |
case | false | interface | static | void |
catch | final | long | strictfp | volatile |
char | finally | native | super | while |
class | float | new | switch | |
const | for | null | synchronized | |
continue | goto | package | this | |
default | if | private | throw |
Die beiden Schlüsselwörter "const" und "goto" werden von Java nicht benutzt.
Die Wörter "null", "true" und "false" sind zwar keine Schlüsselwörter, sondern vordefinierte Literale, aber im Java Examen wird nach dem Unterschied nicht gefragt.
State the effect of using a variable or array element of any kind when no explicit assignment has been made to it.
Java unterstützt zwei Arten von Variablen:- Instanzvariablen (Membervariablen)
- Sie werden in der Sichtbarkeit einer Klasse definiert
- Sie sind von überall erreichbar.
- Sie brauchen explizit initialisiert werden. Sie werden automatisch mit dem Defaultwert initialisiert. Der Defaultwert ist abhängig vom Typ der Variable.
- Statische Variablen sind eine Art von Instanzvariablen. Sie werden initialisiert, bevor der Konstruktor aufgerufen wird.
- Methodenvariablen (Automatic variables)
- Sie werden in einer Methode definiert
- Sie existieren nur in dieser Methode
- Sie sind nur in dieser Methode erreichbar
- Man muss sie explizit initialisieren. Wenn eine Variable verwendet wird, ohne dass sie initialisiert wurde, erhält man Compilerfehler.
Defaultwerte
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
boolean | false |
char | '\u0000' |
objekt | null |
State the range of all primitive formats, data types and declare literal values for String and all primitive types using all permitted formats bases and representations.
Java unterscheidet zwischen 8 verschiedenen primitiven Datentypen. Die Grösse dieser Datentypen ist in Java-Spezifikation festgelegt.primitive Datentypen
Typ | Grösse | min Wert | max Wert |
boolean | 1 | - | false, true |
char | 16 | '\u0000' (0) |
'\uffff' (216-1 oder 65536) |
byte | 8 | -27 (128) | 27-1 (127) |
short | 16 | -215 (32768) | 215-1 (32767) |
int | 32 | -231 (2147483648) | 231-1 (2147483647) |
long | 64 | -263 (9223372036854775808) | 263-1 (9223372036854775807) |
float | 32 | -3.4 * 1038 | 3.4 * 1038 |
double | 64 | -1.8 * 10308 | 3.4 * 10308 |
Char- und String-Literale:
Ein char Literal kann nur ein Zeichen, eingeschlossen in einfache Anführungszeichen annehmen, unter der Voraussetzung, dass dieses Zeichen auf der Tastatur vorhanden ist. Falls dieses Zeichen nicht auf der Tastatur vorhanden ist, so wird der Unicodewert, bestehend aus vier Ziffern, des Zeichens eingegeben. Beispiel:
char spc = '\u0020' für ein Leerzeichen.
String-Literale sind Zeichenketten. Sie werden in doppelte Anführungszeichen eingeschlossen. Beispiel:
String name = "Hans Schulz";
Java unterstützt verschiedene Escape Sequenzen, die unten aufgeführt sind.
Escape Sequenzen
Escape Sequenz | Bedeutung |
'\b' | Schritt zurück |
'\f' | Seitenschaltung |
'\n' | neue Zeile |
'\r' | Wagenrücklauf |
'\t' | Tabulator |
'\'' | einfache Anführungszeichen |
'\"' | doppelte Anführungszeichen |
'\\' | Rückwärts-Schrägstrich |
Integralwerte Literale
Integralwerte haben drei verschiedene Formen:
- Dezimal (Voreinstellung)
- Oktal: Um Zahlen in diesen Formaten darzustellen, gibt vor der Zahl eine "0" ein. Die Zahl "010" entspricht der Dezimalzahl 8.
- Hexadezimal: Um hexadezimale Zahlen darzustellen, werden "0x" oder "0X" voreingestellt. Die Zahl "0x12" entspricht der Dezimalzahl 18. Die hexadezimalen Buchstaben a bis f entsprechen den Dezimalzahlen 10 bis 15. Gross-Kleinschreibung spielt keine Rolle.
Fliesskomma-Literal:
Für die Fliesskommaliterale verwendet man die untenstehenden Formen:
- Dezimalpunkt, z. B. 3.14159
- Mit dem Buchstaben e bzw. E für Exponent: 1.23e+23
- Mit dem Suffix f bzw. F für float: 13.5f
- Mit dem Suffix d bzw. D für ein double: 13.5674836d