OOP
Object - oriented programming
Motivation
dev_names = []
dev_ages = []
current_name = input("Enter new developer's name: ")
current_age = input("Enter new developer's age: ")
dev_names.append(current_name)
dev_ages.append(current_age)
foo(dev_names[i], dev_ages[j])
- nicht skalierbar
- gefährlich
Object
- besteht aus Daten und Methoden
- z.B. Developer
- Daten
- Name
- Alter
- bekannte Sprachen
- Methoden
- code()
- debug()
- fixBug()
Klasse
- Bauplan
- definiert Objekte der Klasse
class Developer {
String name;
int age;
Language[] knownLanguages;
Code code() {
// code
}
Bug debug() {
// code
}
void fixBug(Bug bug) {
// code
}
}
Instanzierung
- Anlegen eines bestimmten Objektes
-
nur über
new ClassName(params)
Developer scre = new Developer();
scre.name = "Christoph";
scre.age = 42;
Developer refr = new Developer();
refr.name = "Franz";
System.out.println(scre.name);
System.out.println(refr.name);
Christoph
Franz
Referenz
Variable, welche ein Objekt zugewiesen hat
Developer scre = new Developer();
scre.name = "Christoph";
Developer schreiber = scre;
schreiber.name = "Schreiber";
System.out.println(schreiber.name); -> "Schreiber"
System.out.println(scre.name); -> "Schreiber"
dasselbe Objekt (dieselbe Instanz der Klasse)
Developer refr = new Developer();
refr.name = "Franz";
- 1 Klasse:
Developer - 2 Objekte: 2 x
new Developer() - 3 Referenzen:
scre,schreiber,refr
Konstruktor
class Developer {
String name;
int age;
Developer(String name, int age) {
this.name = name;
this.age = age;
}
}
Developer scre = new Developer("Christoph", 42);
- zur Initialisierung
- heißt wie die Klasse
this
Referenz auf das entsprechende Objekt
void printName() {
System.out.println(this.name);
}
Developer scre = new Developer("Christoph", 42);
Developer refr = new Developer("Franz", 42);
scre.printName(); -> "Christoph"
refr.printName(); -> "Franz"
Konstruktorverkettung
Developer(String name, int age) {
this.name = name;
this.age = age;
}
Developer(String name) {
this.name = name;
age = 0;
}
Developer(String name) {
this(name, 0);
}
Defaultkonstruktor
class Dog {
}
new Dog();
hat eine Klasse keinen Konstruktor, wird ein parameterloser ergänzt
class Dog {
public Dog() {
}
}
toString
Developer scre = new Developer("Christoph", 42);
System.out.println(scre);
Developer@490ab905
class Developer {
String name;
int age;
...
public String toString() {
return name + ", " + age;
}
}
Christoph, 42
🐍
class Developer:
pass
scre = Developer()
class Developer:
def __init__(self, name, age=0):
self.name = name
self.age = age
scre = Developer('scre', 42)
refr = Developer('refr')
print(scre, scre.name)
<developer.Developer object at 0x0000027863986588> scre
def __str__(self) -> str:
return f'{self.name}, {self.age}'
scre, 42
Statische Member
class Developer {
static int count;
static Developer[] getAll() { ... }
Developer(String name, int age) {
this.name = name;
this.age = age;
count++;
}
}
Developer scre = new Developer("Christoph", 42);
Developer refr = new Developer("Franz", 42);
System.out.println(Developer.count + " " + refr.name); -> 2 Franz
Developer[] devs = Developer.getAll();
instance.instanceMethod()
instance.variable
Class.staticMethod()
Class.staticVariable
Access Modifier
Implementierungsdetails sind zu verbergen
| eigene Klasse | eigenes Package | Subklassen | Jeder | |
|---|---|---|---|---|
| private | ✔️ | 🚫 | 🚫 | 🚫 |
| ✔️ | ✔️ | 🚫 | 🚫 | |
| protected | ✔️ | ✔️ | ✔️ | 🚫 |
| public | ✔️ | ✔️ | ✔️ | ✔️ |
- alle Instanzvariablen
private - Methoden so wenig wie nötig
Setter/Getter
class Developer {
private String name;
private boolean responsible;
...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isResponsible() {
return responsible;
}
}
wenn nötig ⟹ Kapselung