java-intensivkurs ws07/08 folie 1 ashraf abu baker [email protected] johann wolfgang...
TRANSCRIPT
Java-Intensivkurs WS07/08Folie 1
Ashraf Abu [email protected]
Johann Wolfgang Goethe-UniversitätProfessur für Graphische DatenverarbeitungFachbereich Informatik und MathematikProf. Dr. Detlef Krömker
Java-Intensivkurs WS07/08Folie 2
Referenzen in Java
Unterschied zwischen einer primitiven Variablen und einer Referenzvariablen:
semesteranzahl speichert den tatsächlichen Wert der Variablen (3) studiengang speichert eine Referenz auf ein String-Objekt, dessen Wert „BWL“ ist
public class Student {public String name;//Referenzvariable (Objektreferenz)public Date gebDatum;// Referenzvariable (Objektreferenz)public String studiengang;// Referenzvariable (Objektreferenz)public int semesteranzahl; //primitive Variable } Student student = new Student("Alex", null, "BWL",3);
Java-Intensivkurs WS07/08Folie 3
Referenzen in Java
Der new-Operator liefert eine Referenz auf das erzeugte Objekt zurück
Die Referenz wird dann in der Variablen student gespeichert
Student student = new Student("Alex", null, "BWL",3);
Java-Intensivkurs WS07/08Folie 4
Referenzen
Man sagt, daß die Variable das Objekt referenziert bzw. darauf zeigt
In manchen Implementierungen der JVM wird eine Referenz als Speicheradresse implementiert Eine Referenzvariable speichert dann die Speicheradresse ihres Objektes
null-ReferenzZeigt auf kein Objekt und speichert den Wert null
Java-Intensivkurs WS07/08Folie 5
Referenzen
Referenzvariablen werden standardmäßig mit null initialisiert bevor ihnen ein Objekt zugewiesen wird
Java-Intensivkurs WS07/08Folie 6
this & super
Neben den eigenen und geerbten Attributen einer Klasse, verfügen die Instanzmethoden und die Konstruktoren über zwei weitere Referenzen
this:- Referenz auf das Objekt selbst
super: - Referenz auf das Objekt der Oberklasse
Java-Intensivkurs WS07/08Folie 7
this
this-Referenz wird verwendet zur:
Unterscheidung zwischen einer Objektvariablen und einer übergebenen Variablen innerhalb einer Methode oder eines Konstruktors
- x2 ist der übergebene Parameter - this.x2 ist das Objektattribut, die ebenfalls x2 heißt
public Line(float x2, float y2){this.x2=x2;
this.y2=y2;}
Java-Intensivkurs WS07/08Folie 8
super
Analog kann innerhalb einer Klasse mit super auf die Attribute und Methoden der Oberklasse zugegriffen werden
public void translate(float dx, float dy) { x2 += dx;
y2 += dy;
// Wiederverwendung des Codes der Oberklasse super.translate(dx, dy);
}
Java-Intensivkurs WS07/08Folie 9
this(), super()
public Line(float x2, float y2) {this.x2 = x2;this.y2 = y2;
}
public Line(float x1, float y1,float x2, float y2){
this(x2,y2);//Aufruf des eigenen Konstruktors //Line(float x2, float y2)
this.x1=x1;this.y1=y1; }
Java-Intensivkurs WS07/08Folie 10
super()
sdfadsfpublic Line(float x1, float y1,float x2, float y2){ super(x1,y1);//Aufruf des Konstruktors der Oberklasse
this.x2=x2;this.y2=y2;
}
Aufruf von this() und super() muss als erste Anweisung im Konstruktor erfolgen
Aufruf von this.eineMethode() oder super.eineMethode() muss nicht als erste Anweisung erfolgen
Java-Intensivkurs WS07/08Folie 11
Klassen- & Instanzattribute
Zwei Arten von Attributen:Klassen- und Instanzattribute
Klassenattribute (statische Attribute):Werden mit dem Schlüsselwort static deklariert
public static String vorgesetzter;
Java-Intensivkurs WS07/08Folie 12
Klassen- & Instanzattribute
public class Mitarbeiter {
public static String vorgesetzter="Oliver P.";//Klassenvariable
public String abteilung;//Instanzvariable
//statische Methodepublic static void vorgesetzterWechsel(String neuerVorgesetzter){
vorgesetzter = neuerVorgesetzter;}
public void abteilungWechsel(String neueAbteilung){ abteilung=neueAbteilung;
}
Java-Intensivkurs WS07/08Folie 13
Klassen- & Instanzattribute
public static void main(String [] str){
Mitarbeiter nadia=new Mitarbeiter("Nadia O.","Marketing");
Mitarbeiter klaus=new Mitarbeiter("Klaus M.", "Controlling");
nadia.abteilungwechsel("Finanz");klaus.vorgesetzterWechsel("Paul J.");System.out.println(nadia.abteilung);System.out.println(klaus.abteilung);System.out.println(nadia.vorgesetzter);System.out.println(klaus.vorgesetzter);
}}Ausgabe: Finannz Controlling Paul J. Paul J.
Java-Intensivkurs WS07/08Folie 14
Klassenattribute
Sind an die Existenz eines Objektes nicht gebunden
Von jedem statischen Attribut v existiert genau eine einzige Kopie für alle Objekte der Klasse
Alle Objekte sehen den gleichen Wert für v.
Zugriff über:
Klassennamen z.B. Mitrabeiter.vorgesetzter
Instanznamen nadia.vorgesetzter
Java-Intensivkurs WS07/08Folie 15
Instanzattribute (nicht statische Attribute)
Jedes Objekt speichert eine eigene Kopie seiner Objektattribute
Die Änderung des Wertes eines Instanzattributes in einem Objekt hat keine Auswirkung auf die anderen Objekte
Sind an die Existenz eines Objektes gebunden
Zugriff über Klassenamen z.B. Mitarbeiter.name nicht möglich
Java-Intensivkurs WS07/08Folie 16
Klassenmethoden (statische Methoden)
Wird mit dem Schlüsselwort static
Ist an die Existenz eines Objektes nicht gebunden
Kann über den Klassennamen und die Objektreferenz aufgerufen werden //statische Methodepublic static void vorgesetzterWechsel(String
neuerVorgesetzter){ vorgesetzter = neuerVorgesetzter;
}public static void main(String [] str)
Math.sin(a); Math.cos(a); Math.sqrt(a) Float.parseFloat(s)
Java-Intensivkurs WS07/08Folie 17
Instanzmethoden (nicht statische Methoden)
Ist an die Existenz eines Objektes nicht gebunden
Kann nur über ein Objektreferenz aufgerufen werden
Java-Intensivkurs WS07/08Folie 18
Statische Initialisierer
Konstruktoren werden in der Regel verwendet um Variablen zu initialisieren
Für komplexe Initialisierung von Klassenvariablen können sog. statische Initialisierer verwendet werden
Codeblöcke innerhalb einer Klasse, die mit dem Schlüsselwort static deklariert sind
Werden nur ein einziges Mal beim Laden einer Klasse aufgerufen
Java-Intensivkurs WS07/08Folie 19
Statische Initialisierer
Dürfen nur auf die Klassenattribute zugreifen und haben somit weder Zugriff auf die this-Referenz noch auf die Instanzattribute der Klasse
Eine Klasse kann beliebig viele statische Initialisierer enthalten.
Java-Intensivkurs WS07/08Folie 20
Statische Initialisierer
public class InitializationDemo {
//Klassenvariablen
public static Date date;public static int classLuckyNumber;public static int numberOfCreatedInstances;
static{//Statischer Initialisiererdate=Calendar.getInstance().getTime();Random rand=new Random();
int number=rand.nextInt(10);classLuckyNumber=number*number;
}}
Java-Intensivkurs WS07/08Folie 21
Nicht statische Initialisierer
Sie ähneln Konstruktoren
Werden unmittelbar vor dem Aufruf eines Konstruktors aufgerufen
Werden zur Initialisierung von Instanz- und Klassenattributen verwendet
Dürfen auf die this-Referenz zugreifen
Eine Klasse kann beliebig viele Initialisierer enthalten
Java-Intensivkurs WS07/08Folie 22
Nicht statische Initialisierer
public class InitializationDemo {
public int instanceNumber;//Instanzvariablepublic int instanceLuckyNumber;//Instanzvariable
{//nicht-statischer Initialisierer
Random rand=new Random();instanceNumber=rand.nextInt(10);System.out.println();
this.instanceLuckyNumber=rand.nextInt(10);}
Java-Intensivkurs WS07/08Folie 23
Initialisierungsreihenfolge
Beim Laden einer Klasse:1. Alle statischen Attribute werden in der Reihenfolge initialisiert, in der
sie in ihrer Klasse vorkommen 2. Aufruf der statischen Initialisierer
Folgendes passiert, wenn ein Objekt mit dem new-Operator instanziiert werden soll:
1. Instanzattribute werden initialisiert 2. Nicht statischen Initialisierer werden aufgerufen3. Aufruf des Konstruktors
Beispiel: Siehe InitializationDemo.java
Java-Intensivkurs WS07/08Folie 24
Call-By-Reference oder Call-By-Value?
Übergabe von primitiven Variablen:JVM stellt eine Kopie der Variablen und übergibt sie an die Methode
Veränderung der Kopie innerhalb der Methode hat keine Wirkung auf den Variablenwert
Übergabe von Referenzen:Eine Kopie der Referenz (nicht das Objekt) wird erstellt und an die Methode übergeben Jede Änderung des Objektes innerhalb der Methode ist nach außen sichtbar
Java-Intensivkurs WS07/08Folie 25
Call-By-Reference oder Call-By-Value?
Fazit:Parameterübergabe erfolgt per call-by-value
Siehe CallByValue.java
Java-Intensivkurs WS07/08Folie 26
Pakete (packages)
Package:Sammlung von logisch zusammengehörenden Klassen, Interfaces und anderen Typen
Dienen der logischen Gruppierung von Klassen
In anderen Programmiersprachen: Programmierbibliotheken
Alle Klassen der Java-API sind in Pakete unterteilt- Z.B. die Math, String, Wrapper-Klassen in java.lang
Java-Intensivkurs WS07/08Folie 27
Pakete
Ein Paketname besteht aus mehreren durch Punkt getrennten Bezeichnern:
Physikalisch werden Pakte auf eine hierarchische Verzeichnisstruktur abgebildet:
Jeder Bezeichner entspricht dabei einem VerzeichnisVerzeichnisse sind ineinander
verschachtelt
//package declarationpackage de.frankfurt.uni.cs.gdv.visian3d.datastructures.trees;
Java-Intensivkurs WS07/08Folie 28
Pakete
Der voll qualifizierte Name einer Klasse A innerhalb des Paketes de.frankfurt.uni.cs.gdv.datastructures.trees ist de.frankfurt.uni.cs.gdv.datastructures.trees.A
java.lang.String ist der voll qualifizierte Name der Klasse StringDie Java-API 6.0 enthält etwa 202 Pakete, die 3777 Klassen und Interfaces umfassen
Siehe Demo zum anlegen von Paketen
Java-Intensivkurs WS07/08Folie 29
Import
Will eine Klasse z.B. die Klassen oder die Interfaces, eines Paketes verwenden, so müssen diese durch eine import-Anweisung importiert werden, ehe sie benutzt werden können
Eine Klasse zu importieren bedeutet sie samt ihren Attributen und Methoden verfügbar zu machen
Ihr Name wird in den Namensraum der Codedatei eingefügt
import java.util.Random;
Java-Intensivkurs WS07/08Folie 30
Import
Nur Klassen, die nicht im eigenen Paket liegen müssen importiert werden
Ausnahme stellen hier die Bestandteile des Pakets java.lang Da dieses Paket eines der wichtigsten Pakete der Java-API ist werden alle in ihm enthaltenen Klassen vor jedem Compilerlauf automatisch importiert
//importiert alle Klassen und Interfacesimport java.util.*; //importiert ArrayListimport java.util.ArrayList;
Java-Intensivkurs WS07/08Folie 31
Statischer Import
Gibt es erst seit Version 5
Außerhalb einer Klasse können ihre statischen Funktionen und Konstanten nur über den Klassennamen angesprochen werden
Werden die Bestandteile einer Klasse statisch importiert, so können ihre statischen Methoden und Attribute ohne Klassennamen sofort benutzt werden
long longMaxValue=Long.MAX_VALUE;
Java-Intensivkurs WS07/08Folie 32
Statischer Import
//non static import of java.lang.Mathimport java.lang.Math.*; //eigentlich überflüssig
class WithoutStaticImport{
public static void main(String... args) { System.out.println("Wurzel aus "+Math.PI+" ist "+Math.sqrt(Math.PI));
}}
//static import of java.lang.Mathimport static java.lang.Math.*;
public class StaticImport {public static void main(String... args) {
System.out.println("Wurzel aus "+PI+" ist "+sqrt(PI));}}
Java-Intensivkurs WS07/08Folie 33
Datenkapselung und Modifikatoren (modifier)
Durch Datenkapselung sollen einem Objekt nur diejenigen Bestandteile einer Klasse zugänglich gemacht werden, die für das Objekt relevant sind
Alles Andere bleibt verborgen
Zur Unterstützung des Datenkapselungsaspektes definiert Java sog. Modifier
Java-Intensivkurs WS07/08Folie 34
Modifier
Modifier: SchlüsselwörterTeilen dem Compiler Informationen mit, wie z.B. Sichtbarkeit, Veränderbarkeit und Lebensdauer von Klassen, Variablen, Konstruktoren, Methoden und Initialisierer
public, private und protected werden als access-Modifier (Zugriffsmodifikatoren) bezeichnet
//modifierpublic, private, protected, final, abstract, static, native, transient, synchronized, volatile
Java-Intensivkurs WS07/08Folie 35
Modifier
Features einer Klasse:Variable, Methode, Konstruktor oder die Klasse selbst
Auf als public deklarierte Features kann in jeder Klasse ohne Einschränkung zugegriffen werden
private Features können nur innerhalb ihrer eigenen Klasse verwendet werden
Java-Intensivkurs WS07/08Folie 36
Modifier
Wird ein Feature ohne Modifier deklariert, so kann auf dieses nur innerhalb von Klassen zugegriffen werden, die im eigenen Paket liegen
Man spricht hier von einem default-Zugriff
protected:Nur zur Deklaration von Attributen, Methoden und Konstruktoren (nicht für Klassen)
Auf ein protected-Feature einer Klasse kann innerhalb aller Klassen seines Pakets uneingeschränkt zugegriffen werden
Java-Intensivkurs WS07/08Folie 37
protected
Außerhalb vom eigenen Paket können nur Unterklassen auf das Feature zugreifen, und zwar eingeschränkt
Eingeschränkt bedeutet:- Ein Zugriff ist nur außerhalb von Methoden und Konstruktoren
erlaubt:
Java-Intensivkurs WS07/08Folie 38
protected
package modifier1;public class ModifierClass {
protected byte protectedVar = 3; }
package modifier1;public class ForignClassInTheSamePackage {
public static void main(String... arg) {
System.out.println(modifier.protectedVar);}}
Java-Intensivkurs WS07/08Folie 39
protected
package modifier2;
import modifier1.ModifierClass;
public class SubClassOfModifierClass extends ModifierClass { byte protected1=protectedVar;// erlaubter Zugriff auf
}public static void main(String... arg) {
System.out.println(modifier.protectedVar);//Kompilierfehler
}}
Java-Intensivkurs WS07/08Folie 40
final
Kann für Klassen, Variablen, und Methoden verwendet werden
final-Klasse kann nicht abgeleitet werden:- Beispiel für eine final-Klasse ist die Klasse java.lang.Math
Der Wert einer final-Variablen kann nach ihrer Initialisierung nicht mehr verändert werden
public class MyMath extends Math{//Kompilierfehler}Kompilierfehler: The Type MyMath cannot subclass the final class Math
Math.PI=22/7f;Fehlermeldung: The final field Math.PI cannot be assigned.
Java-Intensivkurs WS07/08Folie 41
final
final-Methoden dürfen nicht überschrieben werden. public class Final {
public int x=2;public final void setX(int x){this.x=x;}public final void setX(){this.x=x;}
}class FinalApplication extends Final{
public final void setX(){//Kompilierfehler
}public static void main(String ...strings ){
final Final x=new Final();x.x=2;
}}Kompilierfehler: Cannot override the final method.
Java-Intensivkurs WS07/08Folie 42
Abstrakte Klassen und Methoden
Es kommt häufig vor, dass der Programmierer das Verhalten einer Methode in einer Superklasse nicht definieren kann
Beispiel:
Java-Intensivkurs WS07/08Folie 43
Abstrakte Klassen und Methoden
public abstract class GeometricObject {
public static final int CIRCLE=0;public static final int RECTANGLE=1;public static final int TRIANGLE=2;public static final int UNDEFINED=-1;public int type= UNDEFINED;public abstract float getSurface();//abstract method
public int getType(){//concrete method return type;
} }
Java-Intensivkurs WS07/08Folie 44
Abstrakte Klassen und Methoden
Die Methode getSurface() der Klasse GeometricObject soll die Fläche des geometrischen Objektes berechnen und zurück liefern
Da die Fläche eines geometrischen Objektes von seiner konkreten Implementierung abhängt, ist eine sinnvolle Implementierung der Methode getSurface() in der Oberklasse nicht möglich
In so einem Fall wird die Methode als abstract deklariert
Java-Intensivkurs WS07/08Folie 45
Abstrakte Klassen und Methoden
class Rectangle extends GeometricObject{
public float width;public float height;
public Rectangle(float width, float height){this.width=width;this.height=height;this.type=GeometricObject.RECTANGLE;
}public float getSurface(){
return width*height; }
}
Java-Intensivkurs WS07/08Folie 46
Abstrakte Klassen und Methoden
class Triangle extends GeometricObject{
public float base;public float height;
public Triangle(float base, float height){this.base=base;this.height=height;this.type=GeometricObject.TRIANGLE;
}public float getSurface(){
return .5f*base*height;}
}
Java-Intensivkurs WS07/08Folie 47
Abstrakte Klassen und Methoden
class Circle extends GeometricObject{
public float radius;
public float getSurface(){ return (float)
(Math.PI*radius*radius);
}}
Java-Intensivkurs WS07/08Folie 48
Abstrakte Methoden
Die Implementierung der Methode wird dann den Unterklassen überlassen
Eine als abstract deklarierte Methode wird abstrakte Methode genannt
Besteht sie nur aus einer Deklaration (nur Methodenkopf)Hat keinen Methodenrumpf (keine Implementierung)Anstelle der geschweiften Klammern des Methodenrumpfes wird ein Semikolon gesetzt
//abstract methodpublic abstract float getSurface();
Java-Intensivkurs WS07/08Folie 49
Abstrakte Klassen
Eine Klasse, die mindestens eine abstrakte Methode enthält, muss als abstract deklariert werden
Abstrakte Klassen können nicht instanziiert werden
Eine Unterklasse der abstrakten Klasse, erbt nun die abstrakten Methoden und muss diese überschreiben
Tut sie das nicht, muss sie selbst als abstrakte Klasse definiert werden
Eine abstrakte Klasse kann auch konkrete Methoden enthalten