Java Dokumentation
Markus Brunsch / November 2018
if - else Verzweigung
Dient dazu bestimmte Programmteile nur beim Eintreten vorgegebener Bedingungen auszuführen.
Syntax:
if (bedingung) {
anweisung();
...
} else {
anweisung();
...
}
if wertet zuerst die Bedingung aus, ist sie wahr (true) werden die Anweisungen in if - Block ausgeführt, ist die Bedingung falsch (false) werden die Anweisungen im else - Block ausgeführt.
! Achtung !
Else ist Optional daher muss man keinen else - Block angeben.
Beispiele:
if (myRob.IstWand()){
myRob.LinksDrehen();
} else {
myRob.Schritt();
}
if (myRob.IstWand()){
myRob.LinksDrehen();
}
for Schleife
Syntax:
for (int; bedingung; update){
anweisung();
...
..
.
}
Jeder der 3 Ausdrücke int, bedingung und update kann entfallen.
Beispiel:
for(;;){
myRob.Schritt();
}
Diese Schleife wird endlos ausgeführt !
Bedeutung:
int
= Wird 1x vor Beginn der Scheife ausgeführt. Wird meist zum erzeugen einer Variablen verwendet.
bedingung
= Die Scheife wird solange ausgeführt wie die Bedingung “true
” ist. Gibt man keine Bedingung an, ist sie automatisch “true
”.update
= Wird nach jedem Schleifendurchlauf ausgeführt, so kann eine Variable erhöt oder verringert werden.
Beispiele:
for (int counter = 0; counter < 5; counter++){
myRob.Schritt();
} // Roboter Läuft 5 Schritte
do - while Schleife
Syntax:
do {
anweisung();
...
..
.
} while(bedingung);
Die Do - while Schleife arbeitet nicht abweisend, daher wird sie mindestens 1 mal ausgeführt.
Die Schleife wird nicht erneut ausgeführt, wenn die Bedingung false ist.
While Schleife
Dient zum wiederholen von Programmabschnitten
Syntax:
while(bedingung){
anweisung();
...
..
.
}
Ablauf:
Bedingung wird geprüft ist sie true werden die Anweisungen ausgeführt und die Bedingung wird erneut geprüft. Ist sie false wird der Schleifenblock übersprungen.
Beispiele:
class {
int counter = 0;
while (counter < 9){
counter = counter +1;
}
}
Vergleiche
bedingungen werde auf Gleichheit getestet die Bedingungen egeben einen boolschen Wert.
Operatoren | Bedeutung | Beispiel |
---|---|---|
== |
gleich | x == 3 |
!= |
nicht gleich | x != 3 |
> |
größer als | x > 3 |
< |
kleiner gleich | x < 3 |
<= |
kleiner gleich | x <= 3 |
>= |
größer gleich | x >= 3 |
Beispiel:
Stein ablegen, wenn keiner da liegt.
- Möglichkeit 1.)
if (robi.IstZiegel() == false){
robi.Hinlegen();
}
- Möglichkeit 2.)
if (robi.IstZiegel() != true){
robi.Hinlegen();
}
- Möglichkeit 3.)
if (! robi.IstZiegel()){ robi.Hinlegen(); }
Zugriff auf die eigene Klasse (this)
Wenn übergabeparameter den selben namen haben, wie die Variablen der Klasse, kann man per this angeben, dass man Zugriff auf die Variable der Klasse zugreifen möchte.
Beispiel:
class A{
int A;
A(int A){
this.A=A;
}
}
Methoden
- Definieren des Verhalten von Objekten
z.B.
myRob.Schritt();
- Werden inerhalb einer Klassendefinition angelegt und haben Zugriff auf die Variablen der Klasse
Syntax:
Modifier Datentyp Name (Parameterliste){
Anweisung();
}
Modifier
und Parameterliste
sind Optional und können entfallen.
Beispiel:
void fuenfSchritte(){
for (int i=0; i<5; i++){
myRob.Schritt();
}
}
Wenn die Methode keinen Datentyp mehr liefert ist der Datentyp void.
Der Methoden aufruf erfolgt über:
class rob{
void fuenfSchritte(){
for (int i=0; i<5; i++){
myRob.Schritt();
}
}
public static void main (String []args){
rob robi = new rob();
robi.fuenfSchritte();
}
}
Konstruktor
- Eine Methode ohne Rückgabetyp
- Klassenname als Name
- Kann übergabeparameter enthalten
- Standardkonstruktor enthält keine Übergabeparameter
Beispiel:
class Auto3{
String Marke;
int baujahr;
int leistung;
Auto3(String m, int bj, int L){
Marke = m;
baujahr = bj;
Leistung = L;
}
}
class AutoVerwaltung3{
public static void main (String []args){
Auto3 a = new Auto3("Audi", 2008, 605);
Auto3 b = new Auto3("BMW", 2017, 550);
}
}
Somit wird aus Auto Auto2
class Auto {
int Baujahr = 0;
String Farbe;
String Hersteller;
String Typ;
}
Wie kann man diesen Variablen Werte geben ?
class AutoVerwaltung{
public static void main (String []args){
Auto a = new Auto();
Auto b = new Auto();
}
}
Frage ? Welchen Hersteller hat das Auto A ?
a.Hersteller = "Audi";
a.Baujahr = 2008;
b.Hersteller = "BMW";
b.Baujahr = 2017;
a.Farbe = "schwarz";
a.typ = "RS6";
b.Farbe = "Weis";
b.typ = "M6";
Gibt es alternativen um den Variablen Werte zu geben ?
class Auto2{
int bj;
String farbe;
String hersteller;
String Typ;
void initialisieren (int baujahr, String f, String h, String t){
bj = baujahr;
hersteller = h;
Typ = T;
}
}
class AutoVerwaltung2{
public static void main (String []args){
Auto2 a = new Auto2();
a.initialisieren(2008,"Schwarz","Audi","RS6");
Auto2 b = new A
}
}
Arrays
- Ist ein Feld von Elementen mit gleichem Datentyp
- Elemente können eingefügt und entfernt werden
3 Schritte zum Erstellen eines Arrays
1.) Deklarieren einer Variablen zur Aufnahme des Arrays.
int Werte [];
2.) Erstellen eines neuen Array-Objekts und der Array-Variablen zuweisen.
Werte = new Werte[10];
3.) Speichern von Werten in den Array-Elementen
Werte[0] = 789;
Werte[1] = 123;
Werte[2] = 456;
Werte[9] = 999;
Beispiel:
Flasche fArr[] = new Flasche[12];
for(int i=0; i<12; i++){
if (i==0){
fArr[i] = new Flasche(0);
} else {
fArr[i] = new Flasche ((int) (Math.random()*1000+1));
}
}
Eingabe / Ausgabe (IO) in Java
Ein / Ausgabe findet über Dateien oder Geräte statt.
- Eine Datei oder Gerät wird als Folge eizelner Bytes (Byte Stream) betrachtet oder als Unicode-Stream.
- IM Programm wird eine Datei / Geräte von einem Objekt einer Stream-Klasse repräsentiert.
Folgende abstrakte Klassen sin die Basisklassen aller Streamklassen.
- InputStream
- Klassen zum Byteweisen Lesen
- Reader
- Klassen zum Zeichenweisen (Unicode) Lesen
- OutputStream
- Klassen zum Byteweisen Schreiben
- Writer
- Klasse zum Zeichenweisen Schreiben
In jedem Programm sind folgende Byte-Stream Objekte in der Klasse System vordefiniert:
public static final InputStream in; // Standard Eingabe Objekt
public static final PrintStream out; // Standard Ausgage Objekt
public static final PrintStream err; // Standard Fehlerausgabe Objekt
Lesen von der Standard-Eingabe
Stream-Objekt: System.in
1) Methode zum Einlesen ist read()
1) Liest einzelne Bytes oder ein Feld von Bytes.
Im Programm arbeitet man mit Unicode, deshalb wäre ein Unicode Render Objekt besser zum Einlesen. Dies liefert die Input-Stream-Reader Klasse.
Mit read()
können nur einzelne Zeichen gelesen werden, schöner wäre es, wenn man eine ganze Zeile einlesen könnte. Dies bietet die Klasse BufferedReader mit der Methode readLine()
Außerdem müssen IOExceptions behandelt werden.
Beispiel:
import java.io.*;
class EchoLine(){
public static void main(String[] args){
BufferedReader br = null;
try{
br = new BufferedReader(
new InputStreamReader(System.in));
String Line;
while((Line == br.readLine()) != null){
System.out.println(Line);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
Daten in Java speichern
Zum Speichern von Texten benutzt man writer Klassen. Diese bieten die Methoden:
public void close() // Zum Schließen
public void flush() // Explizites Schreiben
public void write(String str) // Zum Speichern
Der Konstruktor öffnet einen Ausgabestrom der mit “write” beschrieben und mit “close” geschlossen werden kann. Zum schreiben in eine Datei nutzt man die Klasse FileWriter. Bsp:
import java.io.*;
class Schreiben(){
public static void main(String[] args){
String hello = "Hallo Java \n \r";
FileWriter f = null;
try{
f = new FileWriter("Hallo.txt");
f.Write(hello);
} catch (Exception ex){
System.out.println(ex.getMessage());
} finally {
if(f != null){
try {
f.close();
} catch (IOException ex){
System.out.println(ex.getMessage());
}
}
}
}
}
Exception - Ausnahmen Behandlung
Syntax:
try{
anweisung();
} catch (Exception ex){ // Exception = Ausnahmetyp
anweisung
}
Tritt im try-Block ein Fehler auf, wird das Programm unterbrochen und in die erste Passende catch-Klausel mit dem richtigen Ausnahmetyp. Dort kann auf den Fehler reagiert werden.
Der finally-Block wird immer beim verlassen des try-Blocks ausgeführt.
- Wenn das normale Ende der try-Blocks erreicht wurde.
- Wenn eine Ausnahme aufgetreten ist, die durch eine catch-Klausel behandelt wurde.
- Wenn der try-Block durch eine Sprunganweisung
break
/continue
oderreturn
verlassen werden soll. Finally sollte benutzt werden um z.B. Dateien zu schließen oder Ressourcen frei zu geben.
Bsp:
try{
integer.parseint(Str);
} catch (Exception e){
System.out.println("Error");
} finally {
System.out.println("Ende");
}
Konstanten - Final
- Final Variablen können nicht verändert werden. Sie werden in Großbuchstaben geschrieben.
Bsp:
public static final double pi = Math.PI;
- Final - Methoden können nicht überlagert / überschrieben werden.
- Ebenso wenig kann final Klassen zur Ableitung neuer Klassen verwendet werden.
Datenkapselung / Sichtbarkeit Zugriffsbeschränkung
public
–> von überall sichtbarPackage-Private
–> (wenn nichts dasteht) überall im eigenen Paket sichtbar.private
–> nur in der eigenen Klasse sichbarprotected
–> Methoden oder Variablen sind in der eigenen Klasse und in abgeleiteten Klassen sichtbar. Darüber hinaus sind sie für Methoden anderer Klassen innerhalb deselben Pakets sichtbar.
Static
static
Variablen und Methoden existieren vom Laden der Klasse bis zum Beenden des Programms. Sie können ohne ein Objekt der Klasse aufgerufen werden.
Beispiel.)
class A{
int x = 7;
static int z = 1;
public static void main (String[] args){
A a = new A();
a.x = 3; // X ist einmal für Objekt A und a2 Vorhanden
A a2 = new A();
a2.x = 10; // X ist einmal für Objekt A und a2 Vorhanden
a.z = 2; // Z ist einmal vorhanden und hat für Objekt a und a2 den selben Wert.
a2.z = 3;
A.z = 4;
}
}
Vererbung
Um eine neue Klasse aus einer bestehenden abzuleiten, ist im Kopf der Klasse mit Hilfe des Schlüsselwortes extends
ein Verweis auf die Basisklasse anzugeben.
Hier durch erbt die agbeleitete Klasse alle Eigenschaften der Basisklasse. D.h. alle Variablen und alle Methoden (außer wenn diese privat sind). Durch Hinzufügen neuer Elemente oder überladen der vorhandenen kann die Funktionalität der abgeleiteten Klasse erweitert werden.
Bsp:
// Basisklasse / Elternklasse
class a {
void drucken(){
. . .
}
int x = 7;
private int y = 9;
}
// Erbt alle Eigenschaften von Klasse A => Kindsklasse
class b extends a{
// Überschreibt die Methode der Elternklasse
void drucken(){
// Aufrufe der Methode aus der Elternklasse
super.drucken();
System.out.println("Klasse B");
}
int z = 2;
void rechnen(){
z = 3 * x; // Verwenden von X aus der Elternklasse
}
}
class Test{
public static void main(String[] args){
A a1 = new B();
A a2 = new A();
B b1 = new B();
a1.drucken(); // Drucken aus Klasse B
a2.drucken(); // Drucken aus Klasse A
b1.drucken(); // Drucken aus Klasse B
a1.x = 9; // X aus Klasse A
a2.x = 9; // X aus Klasse A
b1.x = 9 // X aus Klasse A
b1.z = 7; // Z aus Klasse B
((B).a1).z = 7; // Variable a1 die vom Typ A ist wird auf B gecastet
((B).a1).rechnen(); // Methode a1 die vom Typ A ist wird auf B gecastet
}
}
Zugriff auf eine MySQL Datenbank
Aller erstens muss man sich den aktuellsten JDBC-Treiber für die Datenbank besorgen.
Der Treiber wird als Bibliotheke in NetBeans eingebunden.
Folgende Schritte sind nun nötig:
import java.sql.*;
- Objekt des JDBC Treibers erzeugen
class.forName("com.mysql.jc.jdbc.Driver").newinstance();
Diese Anweisung muss in einen
try
/catch
Block. - Neuer
try
/catch
Block für die folgenden Anweisungen- Verbindung zum Server:
Connection conn = DriverManager.getConnection("jdbc.mysql://127.0.0.1/db", "user", "password");
- Verbindung zum Server:
- SQL Abfragen erstellen
Statement stmt = conn.createStatement();
- SQL-Select Abfrage und Antword speichern
ResultSet rs = stmt.executeQuery("SELECT * FROM table");
- Ergebnisdatensätze ausgeben
while(rs.next()){ System.out.println(rs.getInt("id")+"\+"+rs.getString("name")); }
- Alles wieder schließen im
finally
Block... } finally { rs.close(); stmt.close(); conn.close(); }
Achtung: Jede
close()
Methode benötigt einen eigenentry
/catch
Block.