mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-11-24 06:53:08 +03:00
498 lines
18 KiB
Markdown
498 lines
18 KiB
Markdown
|
---
|
||
|
language: java
|
||
|
filename: LearnJavaDe.java
|
||
|
contributors:
|
||
|
- ["Jake Prather", "http://github.com/JakeHP"]
|
||
|
- ["Jakukyo Friel", "http://weakish.github.io"]
|
||
|
- ["Madison Dickson", "http://github.com/mix3d"]
|
||
|
- ["Simon Morgan", "http://sjm.io/"]
|
||
|
translators:
|
||
|
- ["Michael Dähnert", "http://github.com/JaXt0r"]
|
||
|
lang: de-de
|
||
|
---
|
||
|
|
||
|
Java ist eine Programmiersprache für vielfältige Aufgaben. Sie ist imperative und objektorientiert.
|
||
|
Oftmals wird sie für Desktop- Webapplikationen sowie als Programmiersprache im Betriebssystem Android verwendet.
|
||
|
[Weitere Informationen \(Englisch\](http://docs.oracle.com/javase/tutorial/java/)
|
||
|
|
||
|
```java
|
||
|
// Einzeilige Kommentare starten mit //
|
||
|
/*
|
||
|
Mehrzeilige Kommentare sehen so aus.
|
||
|
*/
|
||
|
/**
|
||
|
JavaDoc Kommentare haben dieses Format. Sie werden verwendet um Klassen, Attribute sowie Methoden zu beschreiben.
|
||
|
*/
|
||
|
|
||
|
// Importieren der Klasse ArrayList aus dem Paket java.util
|
||
|
import java.util.ArrayList;
|
||
|
// Importieren aller Klassen innerhalb des Paketes java.security
|
||
|
import java.security.*;
|
||
|
|
||
|
// Jede .java Datei besteht aus einer äußeren öffentlichen (public) Klasse.
|
||
|
// Der Name der Klasse muss identisch des Dateinamens sein.
|
||
|
public class LearnJavaDe {
|
||
|
|
||
|
// Ein Programm muss eine main Methode als Eintrittspunkt besitzen.
|
||
|
public static void main (String[] args) {
|
||
|
|
||
|
// System.out.println() wird zum Schreiben von zeilenweisen Ausgaben verwendet.
|
||
|
System.out.println("Hello World!");
|
||
|
System.out.println(
|
||
|
"Integer: " + 10 +
|
||
|
" Double: " + 3.14 +
|
||
|
" Boolean: " + true);
|
||
|
|
||
|
// Zum Schreiben von Ausgaben ohne Zeilenumbruch wird System.out.print() verwendet.
|
||
|
System.out.print("Hello ");
|
||
|
System.out.print("World");
|
||
|
|
||
|
|
||
|
///////////////////////////////////////
|
||
|
// Typen & Variablen
|
||
|
///////////////////////////////////////
|
||
|
|
||
|
// Zum Deklarieren einer Variable nutze <type> <name>
|
||
|
// Byte - 8-bit vorzeichenbehaftete (signed), binäre Ganzzahl
|
||
|
// (-128 <= byte <= 127)
|
||
|
byte fooByte = 100;
|
||
|
|
||
|
// Short - 16-bit vorzeichenbehaftete (signed), binäre Ganzzahl
|
||
|
// (-32,768 <= short <= 32,767)
|
||
|
short fooShort = 10000;
|
||
|
|
||
|
// Integer - 32-bit vorzeichenbehaftete (signed), binäre Ganzzahl
|
||
|
// (-2,147,483,648 <= int <= 2,147,483,647)
|
||
|
int fooInt = 1;
|
||
|
|
||
|
// Long - 64-bit vorzeichenbehaftete (signed), binäre Ganzzahl
|
||
|
// (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)
|
||
|
long fooLong = 100000L;
|
||
|
// L wird verwendet um zu kennzeichnen, dass ein Variablenwert vom Typ long ist.
|
||
|
// Ohne diesen Buchstaben wird die Zahl automatisch als Integer behandelt.
|
||
|
|
||
|
// Hinweis: Java besitzt keine vorzeichenlosen (unsigned) Typen.
|
||
|
|
||
|
// Float - Typ mit einfacher Genauigkeit (Single-precision), 32-bit IEEE 754 Fließkommazahl
|
||
|
float fooFloat = 234.5f;
|
||
|
// f wird verwendet um zu kennzeichnen, dass ein Variablenwert vom Typ float ist;
|
||
|
// Ohne diesen Buchstaben wird die Zahl automatisch als Integer behandelt.
|
||
|
|
||
|
// Double - Typ mit doppelter Genauigkeit (Double-precision), 64-bit IEEE 754 Fließkommazahl
|
||
|
double fooDouble = 123.4;
|
||
|
|
||
|
// Boolean - Wahr & Falsch (true & false)
|
||
|
boolean fooBoolean = true;
|
||
|
boolean barBoolean = false;
|
||
|
|
||
|
// Char - Ein einfacher 16-bit Unicode Buchstabe
|
||
|
char fooChar = 'A';
|
||
|
|
||
|
// final Variablen können von einem anderen Objekt nicht erneut zugeordnet werden.
|
||
|
final int HOURS_I_WORK_PER_WEEK = 9001;
|
||
|
|
||
|
// Zeichenketten (Strings)
|
||
|
String fooString = "My String Is Here!";
|
||
|
|
||
|
// \n ist ein Escape Zeichen welcher eine neue Zeile startet.
|
||
|
String barString = "Schreiben auf einer neuen Zeile?\nKein Problem!";
|
||
|
// \t ist ein Escape Zeichen welcher einen Tab-Zeichen anhängt.
|
||
|
String bazString = "Möchtest du einen Tabulator anhängen?\tKein Problem!";
|
||
|
System.out.println(fooString);
|
||
|
System.out.println(barString);
|
||
|
System.out.println(bazString);
|
||
|
|
||
|
// Arrays
|
||
|
// Die Arraygröße muss bei Instanziierung entschieden werden.
|
||
|
// Das folgende Format funktioniert bei Deklaration eines Arrays
|
||
|
// <datentyp>[] <variablenname> = new <datentyp>[<arraygröße>];
|
||
|
// <datentyp> <variablenname>[] = new <datentyp>[<arraygröße>];
|
||
|
int[] intArray = new int[10];
|
||
|
String[] stringArray = new String[1];
|
||
|
boolean boolArray[] = new boolean[100];
|
||
|
|
||
|
// Eine weitere Möglichkeit ein Array zu deklarieren & initialisieren.
|
||
|
int[] y = {9000, 1000, 1337};
|
||
|
String names[] = {"Bob", "John", "Fred", "Juan Pedro"};
|
||
|
boolean bools[] = new boolean[] {true, false, false};
|
||
|
|
||
|
// Indexierung eines Arrays - Zugriff auf ein Element
|
||
|
System.out.println("intArray @ 0: " + intArray[0]);
|
||
|
|
||
|
// Arrays sind 0-indexiert und veränderbar.
|
||
|
intArray[1] = 1;
|
||
|
System.out.println("intArray @ 1: " + intArray[1]); // => 1
|
||
|
|
||
|
// Weitere nennenswerte Typen
|
||
|
// ArrayLists - Ähnlich Arrays, allerdings werden mehr Funktionen geboten,
|
||
|
// ebenso ist die Arraygröße verwänderbar
|
||
|
// LinkedLists - Implementierung einer doppelt verlinkten Liste.
|
||
|
// Alle Operationen funktioneren so, wie es von einer doppelt verlinkten Liste erwartet wird.
|
||
|
// Weitere Informationen: https://de.wikipedia.org/wiki/Liste_(Datenstruktur)#Doppelt_.28mehrfach.29_verkettete_Liste
|
||
|
// Maps - Eine Sammlung von Objekten, welche eine Verknüpfung von Schlüsseln zu Werten (key => value) vornimmt.
|
||
|
// Eine Map kann keine Duplikate enthalten; Jeder Schlüssel kann genau einen Wert beinhalten.
|
||
|
// HashMaps - Diese Klasse nutzt eine Hashtabelle zur Implementierung eines Map Interfaces.
|
||
|
// Dies erlaubt es zur Laufzeit Standardoperationen wie gib (get) und einfügen (insert)
|
||
|
// selbst für große Mengen in einer konstanten Zeit auszuführen (Laufzeitverhalten O(n)).
|
||
|
|
||
|
///////////////////////////////////////
|
||
|
// Operatoren
|
||
|
///////////////////////////////////////
|
||
|
System.out.println("\n->Operatoren");
|
||
|
|
||
|
int i1 = 1, i2 = 2; // Kurform zur Deklaration mehrerer Variablen.
|
||
|
|
||
|
// Arithmetische Operationen sind einfach nutzbar.
|
||
|
System.out.println("1+2 = " + (i1 + i2)); // => 3
|
||
|
System.out.println("2-1 = " + (i2 - i1)); // => 1
|
||
|
System.out.println("2*1 = " + (i2 * i1)); // => 2
|
||
|
System.out.println("1/2 = " + (i1 / i2)); // => 0 (0.5 Nachkommazahl abgeschnitten)
|
||
|
|
||
|
// Modulo
|
||
|
System.out.println("11%3 = "+(11 % 3)); // => 2
|
||
|
|
||
|
// Vergleichsoperationen
|
||
|
System.out.println("3 == 2? " + (3 == 2)); // => false
|
||
|
System.out.println("3 != 2? " + (3 != 2)); // => true
|
||
|
System.out.println("3 > 2? " + (3 > 2)); // => true
|
||
|
System.out.println("3 < 2? " + (3 < 2)); // => false
|
||
|
System.out.println("2 <= 2? " + (2 <= 2)); // => true
|
||
|
System.out.println("2 >= 2? " + (2 >= 2)); // => true
|
||
|
|
||
|
// Bitwise Operatoren!
|
||
|
/*
|
||
|
~ Unäres (unary) bitweise Komplement
|
||
|
<< Vorzeichenbehaftete (signed) linke Verschiebung
|
||
|
>> Vorzeichenbehaftete (signed) rechte Verschiebung
|
||
|
>>> Vorzeichenlose (unsigned) linke Verschiebung
|
||
|
& Bitweise UND (AND)
|
||
|
^ Bitweise exklusive ODER (OR)
|
||
|
| Bitweise inklusive ODER (OR)
|
||
|
*/
|
||
|
|
||
|
// Inkrementierungen
|
||
|
int i = 0;
|
||
|
System.out.println("\n->Inc/Dec-rementierung");
|
||
|
// Die ++ und -- operatoren inkrementieren und dekrementieren jeweils um 1.
|
||
|
// Werden sie vor die Variable gesetzt, ink-/dekrementieren sie und geben anschließend ihren Wert zurück.
|
||
|
// Hinter der Variable geben sie ihren Wert zurück und ändern ihn anschließend.
|
||
|
System.out.println(i++); // i = 1, schreibt 0 (post-increment)
|
||
|
System.out.println(++i); // i = 2, schreibt 2 (pre-increment)
|
||
|
System.out.println(i--); // i = 1, schreibt 2 (post-decrement)
|
||
|
System.out.println(--i); // i = 0, schreibt 0 (pre-decrement)
|
||
|
|
||
|
///////////////////////////////////////
|
||
|
// Kontrollstrukturen
|
||
|
///////////////////////////////////////
|
||
|
System.out.println("\n->Kontrollstrukturen");
|
||
|
|
||
|
// If Bedingungen sind wie in den C-Sprachen aufgebaut
|
||
|
int j = 10;
|
||
|
if (j == 10){
|
||
|
System.out.println("Ich wurde geprinted");
|
||
|
} else if (j > 10) {
|
||
|
System.out.println("Ich nicht");
|
||
|
} else {
|
||
|
System.out.println("Ich auch nicht");
|
||
|
}
|
||
|
|
||
|
// While Schleife
|
||
|
int fooWhile = 0;
|
||
|
while(fooWhile < 100) {
|
||
|
System.out.println(fooWhile);
|
||
|
// Den Zähler inkrementieren
|
||
|
// 100x iterieren, fooWhile 0,1,2...99
|
||
|
fooWhile++;
|
||
|
}
|
||
|
System.out.println("fooWhile Wert: " + fooWhile);
|
||
|
|
||
|
// Do While Schleife
|
||
|
int fooDoWhile = 0;
|
||
|
do {
|
||
|
System.out.println(fooDoWhile);
|
||
|
// Den Zähler inkrementieren
|
||
|
// 99x iterieren, fooDoWhile 0->99
|
||
|
fooDoWhile++;
|
||
|
} while(fooDoWhile < 100);
|
||
|
System.out.println("fooDoWhile Wert: " + fooDoWhile);
|
||
|
|
||
|
// For Schleife
|
||
|
int fooFor;
|
||
|
// for Schleifenstruktur => for(<start_statement>; <Bedingung>; <Schritt>)
|
||
|
for (fooFor = 0; fooFor < 10; fooFor++) {
|
||
|
System.out.println(fooFor);
|
||
|
// 10x iterieren, fooFor 0->9
|
||
|
}
|
||
|
System.out.println("fooFor Wert: " + fooFor);
|
||
|
|
||
|
// For Each Schleife
|
||
|
// The for Schleife kann verwendet werden um über Arrays ebenso wie Objekte,
|
||
|
// welche das Interface Iterable implementieren zu iterieren.
|
||
|
int[] fooList = {1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||
|
// for each Schleifenstruktur => for (<Objekt> : <iterable>)
|
||
|
// Wird gelesen als: Iteriere für jedes Element im Iterable
|
||
|
// Hinweis: Der Objekttyp muss dem Elementtyp des Iterable entsprechen.
|
||
|
|
||
|
for (int bar : fooList) {
|
||
|
System.out.println(bar);
|
||
|
//9x iterieren und die Werte 1-9 auf jeweils einer neuen Zeile schreiben
|
||
|
}
|
||
|
|
||
|
// Switch Case
|
||
|
// A Schalter (switch) funktioniert mit den Datentypen byte, short, char und int.
|
||
|
// Ebenso kann er für Aufzählungen (Enums) verwendet werden (Enum Typen folgen weiter unten)
|
||
|
// der String Klasse (ab Java SE7) und ein paar spezielle Klassen, welche die primitiven Typen ummanteln (wrap):
|
||
|
// Character, Byte, Short, and Integer.
|
||
|
int monat = 3;
|
||
|
String monatsString;
|
||
|
switch (monat) {
|
||
|
case 1: monatsString = "Januar";
|
||
|
break;
|
||
|
case 2: monatsString = "Februar";
|
||
|
break;
|
||
|
case 3: monatsString = "März";
|
||
|
break;
|
||
|
default: monatsString = "Ein anderer Monat";
|
||
|
break;
|
||
|
}
|
||
|
System.out.println("Switch Case Ergebnis: " + monatsString);
|
||
|
|
||
|
// Bedingungsoperator (Conditional Shorthand)
|
||
|
// Der Operator '?' kann für schnelle Zuweisungen oder logische Verzweigungen genutzt werden.
|
||
|
// Er ist wie folgt zu lesen: Wenn die Bedingung wahr ist, nutze <erster Wert>
|
||
|
// ansonsten nutze <zweiter Wert>
|
||
|
int foo = 5;
|
||
|
String bar = (foo < 10) ? "A" : "B";
|
||
|
System.out.println(bar); // Schreibt A, denn die Bedingung ist wahr.
|
||
|
|
||
|
|
||
|
////////////////////////////////////////
|
||
|
// Typkonvertierung und Type-Casting
|
||
|
////////////////////////////////////////
|
||
|
|
||
|
// Konvertierung von Daten
|
||
|
|
||
|
// Konvertiere String nach Integer
|
||
|
Integer.parseInt("123");// Gibt die Integer Repräsentation von "123" zurück
|
||
|
|
||
|
// Konvertiere String nach Integer
|
||
|
Integer.toString(123);// Gibt die String Repräsentation von 123 zurück
|
||
|
|
||
|
// Für andere Konvertierungen sind die folgenden Klassen zu betrachten:
|
||
|
// Double
|
||
|
// Long
|
||
|
// String
|
||
|
|
||
|
// Tpe-Casting
|
||
|
// Java Objekte können benfalls konvertiert werden, hierbei gibt es vielfältige Konzepte.
|
||
|
// Weitere Informationen finden sich hier (englisch):
|
||
|
// http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
|
||
|
|
||
|
|
||
|
///////////////////////////////////////
|
||
|
// Klassen und Funktionen
|
||
|
///////////////////////////////////////
|
||
|
|
||
|
System.out.println("\n->Klassen & Funktionen");
|
||
|
|
||
|
// (Die Definition der Klasse Fahrrad folgt)
|
||
|
|
||
|
// Verwendung einer neuen Klasseninstanz
|
||
|
Fahrrad trek = new Fahrrad();
|
||
|
|
||
|
// Aufruf von Methoden des Objektes
|
||
|
trek.erhöheGeschwindigkeit(3); // Es sollten immer getter- und setter- Methoden verwendet werden
|
||
|
trek.setTrittfrequenz(100);
|
||
|
|
||
|
// toString gibt die StringRepräsentation des Objektes zurück.
|
||
|
System.out.println("trek info: " + trek.toString());
|
||
|
|
||
|
} // Ende der Main Methode
|
||
|
} // Ende der LearnJavaDe Klasse
|
||
|
|
||
|
|
||
|
// In einer .java-Datei können zusätzliche nicht öffentliche (non-public) äüßere Klassen vorhanden sein.
|
||
|
|
||
|
|
||
|
// Syntax der Klassendeklaration:
|
||
|
// <public/private/protected> class <Klassenname> {
|
||
|
// // Es folgen Datenfelder, Konstruktoren, Funktionen.
|
||
|
// // Funktionen werden in Java Methoden genannt.
|
||
|
// }
|
||
|
|
||
|
class Fahrrad {
|
||
|
|
||
|
// Felder/Variablen der Klasse Fahrrad
|
||
|
public int trittfrequenz; // Public: Kann von überall her angesprochen werden
|
||
|
private int geschwindigkeit; // Private: Nur innerhalb der Klasse sichtbar
|
||
|
protected int gang; // Protected: Erreichbar innerhalb der Klasse oder Subklassen (sub classes)
|
||
|
String name; // default: Nur innerhalb des Paketes verwendbar
|
||
|
|
||
|
// Eine Klasse kann mittelst Konstruktoren erstellt werden.
|
||
|
// Das ist ein Konstruktor
|
||
|
public Fahrrad() {
|
||
|
gang = 1;
|
||
|
trittfrequenz = 50;
|
||
|
geschwindigkeit = 5;
|
||
|
name = "Bontrager";
|
||
|
}
|
||
|
|
||
|
// Das ist ein Konstruktor mit Argumenten
|
||
|
public Bicycle(int initialTrittfrequenz, int initialGeschwindigkeit, int initialGang,
|
||
|
String name) {
|
||
|
this.gang = initialGang;
|
||
|
this.trittfrequenz = initialTrittfrequenz;
|
||
|
this.geschwindigkeit = initialGeschwindigkeit;
|
||
|
this.name = name;
|
||
|
}
|
||
|
|
||
|
// Syntax von Methoden (Funktionen):
|
||
|
// <public/private/protected> <Rückgabetyp> <Funktionsname>(<Argumente>)
|
||
|
|
||
|
// Java Klassen implementieren oftmals getter- und setter-Methoden ihrer Felder
|
||
|
|
||
|
// Syntax von Methodendeklarationen:
|
||
|
// <Sichtbarkeit> <Rückgabetyp> <Methodenname>(<Argumente>)
|
||
|
public int getTrittfrequenz() {
|
||
|
return tri;
|
||
|
}
|
||
|
|
||
|
// void Methoden benötigen kein return Statement.
|
||
|
public void setCadence(int newValue) {
|
||
|
cadence = newValue;
|
||
|
}
|
||
|
|
||
|
public void setGear(int newValue) {
|
||
|
gear = newValue;
|
||
|
}
|
||
|
|
||
|
public void erhöheGeschwindigkeit(int increment) {
|
||
|
speed += increment;
|
||
|
}
|
||
|
|
||
|
public void verringereGeschwindigkeit(int decrement) {
|
||
|
speed -= decrement;
|
||
|
}
|
||
|
|
||
|
public void setName(String newName) {
|
||
|
name = newName;
|
||
|
}
|
||
|
|
||
|
public String getName() {
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
//Methode zur Darstellung der Attributwerte des Objektes.
|
||
|
@Override
|
||
|
public String toString() {
|
||
|
return "Gang: " + gang + " Trittfrequenz: " + trittfrequenz + " Geschwindigkeit: " + geschwindigkeit +
|
||
|
" name: " + name;
|
||
|
}
|
||
|
} // Ende der Klasse Fahrrad
|
||
|
|
||
|
// Hochrad ist eine Subklasse von Fahrrad
|
||
|
class Hochrad extends Fahrrad {
|
||
|
// (Hochräder sind Fahrräder mit einem extrem großen Vorderrad.
|
||
|
// Sie haben keine Gänge.)
|
||
|
|
||
|
public Hochrad(int initialTrittfrequenz, int initialGeschwindigkeit){
|
||
|
// Aufruf des Vater-Konstruktors (parent constructor) mit dem Wort super.
|
||
|
super(initialTrittfrequenz, initialGeschwindigkeit, 0, "Hochrad");
|
||
|
}
|
||
|
|
||
|
// Überschriebene Methoden sollten die Annotation @Override besitzen.
|
||
|
// Mehr zu Annotationen und deren Verwendungszwecken kann hier nachgelesen werden:
|
||
|
// (englisch) http://docs.oracle.com/javase/tutorial/java/annotations/
|
||
|
@Override
|
||
|
public void setGang(int gang) {
|
||
|
gang = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Schnittstellen (Interfaces)
|
||
|
// Interface Deklaration
|
||
|
// <Zugriffsrecht> interface <Name> extends <super-Interface> {
|
||
|
// // Konstanten
|
||
|
// // Methodendeklarationen
|
||
|
// }
|
||
|
|
||
|
// Beispiel - Nahrung:
|
||
|
public interface Essbar {
|
||
|
public void essen(); // Jede Klasse, die dieses Interface implementiert
|
||
|
// muss auch diese Methode implementieren.
|
||
|
}
|
||
|
|
||
|
|
||
|
public interface Verdaulich {
|
||
|
public void verdauen();
|
||
|
}
|
||
|
|
||
|
|
||
|
// Nun können wir eine Klasse erstellen, die beide Interfaces implementiert.
|
||
|
public class Frucht implements Essbar, Verdaulich {
|
||
|
@Override
|
||
|
public void essen() {
|
||
|
// ...
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void verdauen() {
|
||
|
// ...
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Mit Java kann man nur eine Klasse erweitern (extends) jedoch mehrere Interfaces implementieren.
|
||
|
// z.B.:
|
||
|
public class BeispielKlasse extends ParentBeispielKlasse implements InterfaceEins,
|
||
|
InterfaceZwei {
|
||
|
@Override
|
||
|
public void methodeInterfaceEins() {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void methodeInterfaceZwei() {
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Weitere Informationen (in englisch)
|
||
|
|
||
|
Die folgenden Links dienen lediglich dazu Verständnis für die Kapitel aufzubauen.
|
||
|
Für tiefergreifende Fragen ist Google der beste Startpunkt.
|
||
|
|
||
|
**Offizielle Oracle Guides**:
|
||
|
|
||
|
* [Java Tutorial Trail from Sun / Oracle](http://docs.oracle.com/javase/tutorial/index.html)
|
||
|
|
||
|
* [Java Access level modifiers](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)
|
||
|
|
||
|
* [Object-Oriented Programming Concepts](http://docs.oracle.com/javase/tutorial/java/concepts/index.html):
|
||
|
* [Inheritance](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)
|
||
|
* [Polymorphism](http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)
|
||
|
* [Abstraction](http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
|
||
|
|
||
|
* [Exceptions](http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html)
|
||
|
|
||
|
* [Interfaces](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)
|
||
|
|
||
|
* [Generics](http://docs.oracle.com/javase/tutorial/java/generics/index.html)
|
||
|
|
||
|
* [Java Code Conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html)
|
||
|
|
||
|
**Online Tutorials**
|
||
|
|
||
|
* [Learneroo.com - Learn Java](http://www.learneroo.com)
|
||
|
|
||
|
* [Codingbat.com](http://codingbat.com/java)
|
||
|
|
||
|
|
||
|
**Bücher**:
|
||
|
|
||
|
* [Head First Java](http://www.headfirstlabs.com/books/hfjava/)
|
||
|
|
||
|
* [Thinking in Java](http://www.mindview.net/Books/TIJ/)
|
||
|
|
||
|
* [Objects First with Java](http://www.amazon.com/Objects-First-Java-Practical-Introduction/dp/0132492660)
|
||
|
|
||
|
* [Java The Complete Reference](http://www.amazon.com/gp/product/0071606300)
|