oop

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)
&ltdeveloper.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