Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in die OOP in Java

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in die OOP in Java"—  Präsentation transkript:

1 Einführung in die OOP in Java
Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Einführung in die OOP in Java WS 07/08 Ashraf Abu Baker Java-Intensivkurs WS07/08 Folie 1

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/08 Folie 2

3 Student student = new Student("Alex", null, "BWL",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/08 Folie 3

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-Referenz Zeigt auf kein Objekt und speichert den Wert null Java-Intensivkurs WS07/08 Folie 4

5 Referenzen Referenzvariablen werden standardmäßig mit null initialisiert bevor ihnen ein Objekt zugewiesen wird Java-Intensivkurs WS07/08 Folie 5

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/08 Folie 6

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/08 Folie 7

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/08 Folie 8

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/08 Folie 9

10 super() sdfadsf public 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/08 Folie 10

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/08 Folie 11

12 Klassen- & Instanzattribute
public class Mitarbeiter { public static String vorgesetzter="Oliver P.";//Klassenvariable public String abteilung;//Instanzvariable //statische Methode public static void vorgesetzterWechsel(String neuerVorgesetzter) { vorgesetzter = neuerVorgesetzter; } public void abteilungWechsel(String neueAbteilung){ abteilung=neueAbteilung; Java-Intensivkurs WS07/08 Folie 12

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/08 Folie 13

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/08 Folie 14

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/08 Folie 15

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 Methode public 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/08 Folie 16

17 Instanzmethoden (nicht statische Methoden)
Ist an die Existenz eines Objektes nicht gebunden Kann nur über ein Objektreferenz aufgerufen werden Java-Intensivkurs WS07/08 Folie 17

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/08 Folie 18

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/08 Folie 19

20 Statische Initialisierer
public class InitializationDemo { //Klassenvariablen public static Date date; public static int classLuckyNumber; public static int numberOfCreatedInstances; static{//Statischer Initialisierer date=Calendar.getInstance().getTime(); Random rand=new Random(); int number=rand.nextInt(10); classLuckyNumber=number*number; } Java-Intensivkurs WS07/08 Folie 20

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/08 Folie 21

22 Nicht statische Initialisierer
public class InitializationDemo { public int instanceNumber;//Instanzvariable public 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/08 Folie 22

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 aufgerufen 3. Aufruf des Konstruktors Beispiel: Siehe InitializationDemo.java Java-Intensivkurs WS07/08 Folie 23

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/08 Folie 24

25 Call-By-Reference oder Call-By-Value?
Fazit: Parameterübergabe erfolgt per call-by-value Siehe CallByValue.java Java-Intensivkurs WS07/08 Folie 25

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/08 Folie 26

27 Pakete Ein Paketname besteht aus mehreren durch Punkt getrennten Bezeichnern: Physikalisch werden Pakte auf eine hierarchische Verzeichnisstruktur abgebildet: Jeder Bezeichner entspricht dabei einem Verzeichnis Verzeichnisse sind ineinander verschachtelt //package declaration package de.frankfurt.uni.cs.gdv.visian3d.datastructures.trees; Java-Intensivkurs WS07/08 Folie 27

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 String Die Java-API 6.0 enthält etwa 202 Pakete, die 3777 Klassen und Interfaces umfassen Siehe Demo zum anlegen von Paketen Java-Intensivkurs WS07/08 Folie 28

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/08 Folie 29

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 Interfaces import java.util.*; //importiert ArrayList import java.util.ArrayList; Java-Intensivkurs WS07/08 Folie 30

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/08 Folie 31

32 Statischer Import //non static import of java.lang.Math
import 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.Math import 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/08 Folie 32

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/08 Folie 33

34 Modifier Modifier: Schlüsselwörter Teilen 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 //modifier public, private, protected, final, abstract, static, native, transient, synchronized, volatile Java-Intensivkurs WS07/08 Folie 34

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/08 Folie 35

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/08 Folie 36

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/08 Folie 37

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/08 Folie 38

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/08 Folie 39

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/08 Folie 40

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/08 Folie 41

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/08 Folie 42

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/08 Folie 43

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/08 Folie 44

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/08 Folie 45

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/08 Folie 46

47 Abstrakte Klassen und Methoden
class Circle extends GeometricObject{ public float radius; public float getSurface(){ return (float)(Math.PI*radius*radius); } Java-Intensivkurs WS07/08 Folie 47

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 method public abstract float getSurface(); Java-Intensivkurs WS07/08 Folie 48

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 Java-Intensivkurs WS07/08 Folie 49


Herunterladen ppt "Einführung in die OOP in Java"

Ähnliche Präsentationen


Google-Anzeigen