Methode

Werbung
Objekt-Orientierte Programmierung
• Ein OO-Programm modelliert eine Anwendung als
eine Welt von Objekten, die miteinander in
Beziehung stehen (↑später).
• Ein Objekt kann andere Objekte erzeugen.
• Ein Objekt kann eigene Methoden und die Methoden
anderer Objekte aufrufen.
• Ein Objekt hat Datenfelder, die Werte beinhalten und
während des Programmablaufs geändert werden
können.
1
Objekte
• Können zur Modellierung von realen Objekten
verwendet werden.
• Können zur Repräsentation von GUI (Graphical
User Interface) Komponenten verwendet werden
(↑später).
• Können Software-Einheiten repräsentieren, z.B.
Ereignisse, Dateien, Bilder, etc.
• Können abstrakte Konzepte repräsentieren, z.B.
Regeln eines Spieles, einen speziellen Tanztyp,
etc.
2
Klassen und Objekte
• Eine Klasse ist ein Stück eines Quellcodes, das
einen speziellen Objekttyp (Sorte) beschreibt.
→ OO-Programmierer schreiben Klassendefinitionen
• Ein Objekt wird eine Instanz einer Klasse genannt.
• Ein Programm kann beliebig viele Instanzen einer
Klasse anlegen und verwenden.
3
Klasse
Objekt
• Eine Blaupause
(Plan) für Objekte
eines speziellen
Typs
Attribute
• Definiert die Struktur
(Anzahl, Typen) der
Attribute
• Definiert das
Verhalten
Verhalten
(Funktionalität) der
Objekte
4
Klasse: Auto
Attribute:
String typ
Farbe farbe
int
leistung
int
anzPersonen
double verbrauch
int
zufahrendeStrecke
Objekt: ein Auto
Attribute:
typ = "Mustang“
farbe = “gelb”
leistung = 220
anzPersonen = 0
verbrauch = 12.5
zufahrendeStrecke = 10;
Verhalten:
Verhalten:
Insassen hinzufügen bzw.
entfernen,
volltanken,
melde leeren Tank
5
Klasse
vs.
• Ein Stück Quelltext
Objekt
• Eine Instanz in
einem laufenden
Programm
• Geschrieben von
einem
Programmierer
• Wird zur Laufzeit
des Programms
angelegt (von der
main-Methode oder
einer anderen
Methode)
6
Klasse
vs.
• Spezifiziert die
Struktur (die Anzahl
und Typen) seiner
Objektattribute —
gleich für alle
Objekte dieser Sorte
• Spezifiziert das
Verhalten seiner
Objekte
Objekt
• Speichert spezielle
Attributwerte; diese
können sich
während des
Programmlaufs
ändern
• Verhält sich
entsprechend
7
Klassen und Quelldateien
• Jede Klasse ist in einer seperaten Datei gespeichert
• Der Name der Datei muss gleich dem Namen der
Klasse sein, mit der Erweiterung .java
Car.java
public class Car
{
...
}
Konvention: der Name
der Klasse (und der
entspr. Datei)
beginnen mit einem
Großbuchstaben.
(In Java sind alle Namen “case-sensitive”.)
8
Bibliotheken
• Java Programme werden normalerweise nicht “von
Null” geschrieben.
• Es existieren bereits hunderte von
Klassenbibliotheken, in den Klassen für
unterschiedlichste Anwendungen definiert wurden.
• Klassenbibliotheken sind in “Packages” organisiert.
Beispiel:
java.util — miscellaneous utility classes
java.awt — windowing and graphics toolkit
javax.swing — GUI development package
9
import
• Um Klassen innerhalb von Paketen nutzen zu
können, müssen sie dem Compiler präzise
beschrieben werden
• Vollständige qualifizierte Klassennamen beinhalten
den Package-Namen:
java.awt.Color
javax.swing.JButton
• import-Statements zu Beginn des Quellcodes
erlauben es, Abkürzungen zu verwenden:
import javax.swing.JButton;
...
JButton go = new JButton("Go");
vollständig
qualifiziert
10
import
• Man kann alle Klassennamen aus einem Package
importieren lassen, in dem man eine “wildcard” .*
verwendet:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
Importiert alle
Klassen aus awt,
awt.event, und
swing Packages
• java.lang wird automatisch in alle Klassen importiert;
definiert System, Math, Object, String, und andere
häufig verwendete Klassen.
11
SomeClass.java
import ...
import statements
public class SomeClass
{
Members
Attribute
Konstruktoren
Methoden
}
Funktionskopf
Variablen, die den Objektzustand
definieren; prim. Datentypen,
Strings, andere Objekte
Prozeduren für die
Initialisierung der Attribute beim
Anlegen eines neuen Objekts
der Klasse
Aktionen, die ein Objekt
dieser Klasse
ausführen kann
12
Attribute
• Instanz-Variablen
• Der “private Speicher” der Objekte
13
Attribute
Attributname
[private|public] [static] [final] datatype name;
optional:
normalerweise
private
optional: bedeutet,
dass das Attribute
nur einmal für die
Klasse angelegt
wird;
Klassenattribute
int, double, etc., oder
ein Objekt
optional:
bedeutet, dass
das Attribute
eine Konstante
ist
14
Konstruktoren
• Prozeduren, um ein Objekt bei der Konstruktion zu
initialisieren
•
•
•
•
Haben immer den Namen der Klasse
Initialisieren die Objektattribute
Können Parameter haben
Eine Klasse kann mehrere Konstruktoren besitzen,
die sich in der Anzahl und im Typ der Parameter
unterscheiden
15
Konstruktoren
• Ein privater Konstruktor ist ein spezieller
Instanzkonstruktor.
• Er wird häufig für Klassen verwendet, die nur
statische Member enthalten.
• Wenn eine Klasse über einen oder mehrere private
und keine öffentlichen Konstruktoren verfügt, dürfen
von anderen Klassen keine Instanzen dieser Klasse
erstellt werden.

Beispielsweise weil die Klasse nur als ein Behälter
statischer Methoden dienen soll.
16
Konstruktoren
...
Car myCar;
...
myCar = new Car (“Opel”, 6.4, 150, 25000);
...
public class Car
{
...
public Car (String typ, float x, int y, int z)
{
...
}
...
Ein Objekt wird durch
den new Operator
kreiert
Die Anzahl, Reihenfolge
und Typen der Parameter
müssen mit der Deklaration
übereinstimmen
Konstruktor
}
17
Konstruktoren
JButton go = new JButton("Go");
18
Konstruktoren
class Car {
private String
private float
private int
private int
typ;
verbrauch;
ausstoß;
preis;
Car ( String typ, float verbrauch, int co2, int preis ) {
this.typ = typ;
this.verbrauch = verbrauch;
ausstoß = co2;
this.preis = preis;
}
}
Im Rumpf einer Methode kann auf das Objekt, für das die
Methode aufgerufen wird, durch das Schlüsselwort this
verwiesen werden
19
Konstruktoren
class MyStaticClass {
public static int i;
public static short s;
static {
i = 10;
s = 20;
}
}
Ein statischer (parameterloser) Konstruktor kann verwendet
werden, um statische Variablen mit einem Wert zu
initialisieren. Der Konstruktor kann dabei ausschließlich
statische Variablen mit einem Startwert vorbelegen.
20
Methoden
• Methoden werden für ein spezielles Objekt
aufgerufen
• Die Anzahl und Typen der Parameter (Argumente)
eines Funktionsaufrufs müssen mit der Deklaration
übereinstimmen
• Eine Methode liefert entweder einen Wert zurück
oder wird durch das Schlüsselwort void im
Funktionskopf als Prozedur deklariert
21
Methoden
class MyClass {
public int a;
public MyClass ( int x ) {
a = x;
}
public void MyMethod() {
System.out.print("my method was called");
}
}
public class MyTest {
public static void main(String[] args) {
MyClass object = new MyClass(1);
object.a = 3;
System.out.print(object.a);
object.MyMethod();
Der Objektname wird durch den
}
Punktoperator vom gewünschten Element
}
(Attribut/Methode) getrennt notiert.
22
Kapselung
• Die besondere Idee der Klassen und ihrer Objekte ist die
Kapselung von Daten (Programmvariablen) und Algorithmen
(Methoden) in eine Einheit.
• Die Objektorientierung bietet darauf basierend syntaktische
Mittel, um sicherzustellen, dass Prozeduren nur auf die ihnen
zugeordneten Programmvariablen zugreifen.
• Regelung



Die Namen privater Attribute sind nur innerhalb des Klassenrumpfes gültig,
ihre Lebensdauer ist mit der Lebensdauer des Objekts gleichgesetzt.
Private Attribute können ausschließlich durch Zuweisungen im Rumpf von
Methoden des Objekts verändert werden, in dem auch das Attribut
angesiedelt ist und auch nur dort gelesen werden.
Die Lebensdauer der Attribute, der lokalen Daten, eines Objekts und damit
seiner Methoden besteht über die Dauer des Aufrufs einer Methode fort.
23
Methoden
• Konstruktoren und Methoden können andere public
und private Methoden der selben Klasse aufrufen.
• Konstruktoren und Methoden können nur public
Methoden anderer Klassen aufrufen
Class X
Class Y
private field
public Methode
public Methode
private method
24
Kapselung
class Konto {
private String
private String
private int
kontonummer;
kontoinhaber;
kontostand;
Konto(String ktoNummer, String ktoInhaber, int startWert) {
…
}
public void erbUebertrag(Konto kto) {
kontostand = kontostand + kto.kontostand;
kto.kontostand = 0;
}
}
Korrekt, da innerhalb von Methoden eines Objektes einer
Sorte alle lokalen Atttribute und Methoden der Sorte
sichtbar sind!
25
Kapselung
class Konto {
private String
private String
public int
kontonummer;
kontoinhaber;
kontostand;
Konto(String ktoNummer, String ktoInhaber, int startWert) {
…
}
}
public class KontoTester {
public static void main(String[] args) {
Konto meinKonto = new Konto(“123”, “Westermann”, 100);
meinKonto.kontostand = 1000;
System.out.println( meinKonto.kontonummer + “:” +
meinKonto.kontostand );
}
Fehler bei Übersetzung, da kontonummer in main nicht
}
sichtbar ist!
26
Kapselung
Die Referenz null bezeichnet ein vorgegebenes
Referenzelement, dessen Bezugselement
undefiniert ist.
class Car {
public static int
lagerbestand = 0;
private static Car[] lagerListe = new Car[1000];
…
Car(String type, float verbrauch, int co2, int preis) {…}
Car(Car newCar) {…}
public static void einkauf(Car newCar) {
lagerListe[lagerbestand] = new Car(newCar);
lagerbestand++;
}
public static void verkauf(int index) {
lagerListe[index] = null; // nicht empfehlenswert!!!
lagerbestand--;
}
}
Im Rumpf einer (Klassen)methode kann auf
Klassenattribute zugegriffen werden.
27
Kapselung
class Car {
public static int
lagerbestand = 0;
private static float gewinn = 0;
private static Car[] lagerListe = new Car[1000];
…
public static void einkauf(Car newCar) {…}
public static void verkauf(int index) {…}
}
public class Organizer {
public static void main(String[] args) {
Car car = new Car(…);
System.out.println(“Aktueller Bestand:” + Car.lagerbestand);
System.out.println(“Aktueller Gewinn:” + Car.gewinn);
Car.einkauf(car);
}
}
Fehler beim Kompilieren, da Klassenattribut
gewinn in main nicht sichtbar ist!
28
Sichtbarkeiten
• Erlaubte Zugriffe auf Attribute und Methoden:
public
default
private
Klasse selbst
X
X
X
Andere Klasse im gleichen Paket
X
X
Andere Klasse im anderen Paket
X
29
Sichtbarkeit in Packages in Java
• Für Klassen, die auf der obersten Ebene direkt in einem Paket
deklariert sind, gelten folgende Regeln (sie gelten nicht für
Klassen, die als Mitglied einer anderen Klasse definiert wurden
→ später):
• Wenn eine Klasse nicht mit dem Klassenmodifikator "public"
deklariert wird, dann ist sie nur innerhalb ihres Pakets sichtbar.
• Wenn eine Klasse mit dem Klassenmodifizierer "public"
deklariert wird, dann ist sie in allen Paketen der Hierarchie
sichtbar.
• In Java darf nicht mehr als eine öffentliche Klasse in einer
Übersetzungseinheit enthalten sein, eine Übersetzungseinheit
darf aber mehrere (nicht-öffentliche) Klassen enthalten.
• Für Klassendeklarationen der obersten Ebene ist der
Klassenmodifizierer "private" nicht anwendbar.
30
Sichtbarkeit in Packages in Java
• Ein Zugriff auf eine Methode einer Klasse ist nur möglich, wenn
ein Zugriff auf die Klasse möglich ist. Ist der Zugriff auf eine
Klasse möglich, so ist aber der Zugriff auf alle Methoden der
Klasse nicht unbedingt möglich.
• Wenn bei der Deklaration einer Methode keine
Methodenmodifikatoren für den Zugriff angegeben wird, dann ist
die Methode nur in dem Paket der Methode sichtbar.
• Wird eine Methode mit dem Methodenmodifizierer "public„
deklariert, dann ist diese Methode in allen Paketen der
Hierarchie sichtbar.
• Wird eine Methode mit dem Methodenmodifikator "private"
deklariert, so ist diese Methode nur innerhalb der
Klassendeklaration der Klasse sichtbar, in der die Methode
deklariert wird.
31
Herunterladen