Java OOP

Da du jetzt die Java Grundlagen kennst, tauchen wir tiefer in die objektorientierte Programmierung (OOP) von Java ein.

In deinem ersten Java-Code hast du wahrscheinlich Hello World auf der Konsole ausgegeben. Lass uns anschauen, was hier passiert ist:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

In den Java Grundlagen haben wir gelernt, dass main eine spezielle Java Methode ist – sie ist der Code-STARTER. Egal wie groß das Programm ist, der Compiler sucht immer zuerst nach main. Dir ist bereits bekannt, dass Code in einer Java Klasse abläuft, in diesem Fall HelloWorld.

Aber was passiert, wenn wir eine Klasse ohne main-Methode erstellen?

public class SayHelloWorld {
    public String getGreeting() {
        return "Hello, World!";
    }
}

Diese Java Klasse lässt sich nicht direkt ausführen, da sie keine main-Methode hat. ABER wir können SayHelloWorld in HelloWorld importieren, dort als Java Objekt instanziieren und in der main-Methode verwenden:

public class HelloWorld {
    public static void main(String[] args) {
        SayHelloWorld hello = new SayHelloWorld();
        System.out.println(hello.getGreeting());
    }
}
Note

Java OOP bedeutet im Grunde, mit verschiedenen Java Klassen zu arbeiten und diese zu verknüpfen, um Probleme zu lösen. Es gibt natürlich noch viele weitere Details, aber das ist die Basis von Java OOP.

Important

Bevor wir weiterlernen, werfen wir einen Blick auf Java Static.
Hier ist derselbe Code wie oben, aber getGreeting ist jetzt static:

public class SayHelloWorld {
    public static String getGreeting() {
        return "Hello, World!";
    }
}
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(SayHelloWorld.getGreeting());
    }
}

Jetzt erhalten wir dieselbe Ausgabe, ohne ein Java Objekt erstellen zu müssen.

Java Objekt oder Java Static?

Ob du in Java eine Instanz eines Objekts oder eine static-Methode verwenden solltest, hängt davon ab, wie die Methode auf Daten zugreift und wie flexibel der Code sein muss. Schauen wir uns an, wann was zu bevorzugen ist:

Wann verwende ich ein Java Objekt?

Ein Objekt ermöglicht dir, Daten individuell für jede Instanz zu speichern. Das ist ideal, wenn die Methode oder der Zustand der Klasse auf ein spezifisches Objekt bezogen ist.

Beispiel:

public class Konto {
    private double kontostand;
    
    public Konto(double startKontostand) {
        this.kontostand = startKontostand;
    }
    
    public double getKontostand() {
        return this.kontostand;
    }
}

Hier können wir mehrere Konto-Objekte mit unterschiedlichem Kontostand erstellen.

Wann verwende ich eine Java Static Methode?

static-Methoden sind nützlich, wenn die Methode keine spezifischen Daten einer Instanz benötigt, sondern allgemeine Berechnungen oder logische Prozesse durchführt. Sie lassen sich direkt über die Klasse aufrufen, ohne dass ein Objekt erstellt werden muss.

Beispiel:

public class MathHelper {
    public static int add(int a, int b) {
        return a + b;
    }
}

Entscheidungshilfe

  1. Objektmethode (Instanzmethode): Verwende sie, wenn auf Daten oder Methoden einer spezifischen Instanz zugegriffen wird oder diese benötigt werden.
  2. Static Methode: Verwende sie, wenn keine Instanzdaten erforderlich sind und die Methode universell einsetzbar ist.
Note

Einfach gesagt: Wenn der Code sich auf ein spezifisches Objekt bezieht, nutze ein Java Objekt. Wenn der Code für alle Objekte gleich ist, verwende Java Static.


Klassenarten

Basis

Example

Dies ist eine Standardklasse in Java. Ein Objekt wurde in einer anderen Datei erstellt, in die Main-Klasse importiert, und ein Objekt wird erstellt, mit dem wir arbeiten können.

Natürlich gibt es unendlich viele Möglichkeiten, wie man das anpassen kann. Am besten sollten wir die Variablen mit Zugriffsmodifikator auf private setzen.

class Auto {
   // Attribute
   public String brand;
   public double speed;
   public String plate;

   // Konstruktor
   public Auto(String brand, double speed, String plate) {
       this.brand = brand;
       this.speed = speed;
       this.plate = plate;
   }

   // Methode zum Fahren
   public void drive() {
       System.out.println(brand + " fährt mit " + speed + " km/h.");
   }

   // Methode zum Anhalten
   public void stop() {
       speed = 0;
       System.out.println(brand + " hat angehalten.");
   }
}

public class Main {
   public static void main(String[] args) {
       // Erstellen eines Auto-Objekts und Aufruf der Methoden
       Auto meinAuto = new Auto("BMW", 120.5, "AB-1234");
       meinAuto.drive();
       meinAuto.stop();
   }
}
Example

Gleiche BSP aber mit Java Static

class Auto {

  // Statische Methode zum Fahren
  public static void drive(String brand, double speed) {
      System.out.println(brand + " fährt mit " + speed + " km/h.");
  }

  // Statische Methode zum Anhalten
  public static void stop(String brand) {
      System.out.println(brand + " hat angehalten.");
  }
}

public class Main {
  public static void main(String[] args) {
      // Aufruf der statischen Methoden ohne ein Objekt zu erstellen
      Auto.drive("BMW", 120.5);
      Auto.stop("BMW");
  }
}

Java Vererbung

Example

Eine Java Klasse wird erstellt (Parent-Klasse), und alle anderen Java Klassen (Child-Klassen) werden von dieser abgeleitet, in denen die Java klassen die Java Methoden und Java Variablen bei sich kopieren.

class Animal {
   void fly() {
       System.out.println("This animal cannot fly.");
   }

   void run() {
       System.out.println("This animal cannot run.");
   }

   void swim() {
       System.out.println("This animal cannot swim.");
   }
}

class Duck extends Animal {
   @Override
   void fly() {
       System.out.println("The duck flies in the sky.");
   }

   @Override
   void swim() {
       System.out.println("The duck swims in the pond.");
   }
}

class Dog extends Animal {
   @Override
   void run() {
       System.out.println("The dog runs quickly in the park.");
   }
}

class Fish extends Animal {
   @Override
   void swim() {
       System.out.println("The fish swims in the water.");
   }
}


public class Main {
   public static void main(String[] args) {
       Animal duck = new Duck();
       duck.fly(); // Output: The duck flies in the sky.
       duck.run(); // Output: The duck waddles along the shore.
       duck.swim(); // Output: The duck swims in the pond.

       Animal dog = new Dog();
       dog.run(); // Output: The dog runs quickly in the park.
       dog.fly(); // Output: This animal cannot fly.
       dog.swim(); // Output: This animal cannot swim.

       Animal fish = new Fish();
       fish.swim(); // Output: The fish swims in the water.
       fish.fly(); // Output: This animal cannot fly.
       fish.run(); // Output: This animal cannot run.
   }
}

>[!example] >Java Vererbung kann sich noch erweitern und eine Child-Klassen in eine Parent-Klasse umzuwandeln. >```java >class Animal { > void fly() { > System.out.println("This animal cannot fly."); > } > > void run() { > System.out.println("This animal cannot run."); > } > > void swim() { > System.out.println("This animal cannot swim."); > } >} > >class Ostrich extends Animal { > @Override > void run() { > System.out.println("The bird waddles along the shore."); > } > >class Duck extends Ostrich { > @Override > void fly() { > System.out.println("The bird flies in the sky."); > } > @Override > void swim() { > System.out.println("The bird swims in the pond."); > } >} > >class Dog extends Animal { > @Override > void run() { > System.out.println("The dog runs quickly in the park."); > } >} > >class Fish extends Animal { > @Override > void swim() { > System.out.println("The fish swims in the water."); > } >} > > >public class Main { > public static void main(String[] args) { > > Animal dog = new Dog(); > dog.run(); // Output: The dog runs quickly in the park. > dog.fly(); // Output: This animal cannot fly. > dog.swim(); // Output: This animal cannot swim. > > Animal fish = new Fish(); > fish.swim(); // Output: The fish swims in the water. > fish.fly(); // Output: This animal cannot fly. > fish.run(); // Output: This animal cannot run. > > Animal ostrich = new Ostrich(); > ostrich.swim(); //This animal cannot swim > ostrich.fly(); // The bird flies in the sky > ostrich.run(); // The bird waddles along the shore > > Ostrich duck = new Duck(); > duck.fly(); // Output: The bird flies in the sky > duck.run(); // Output: The bird waddles along the shore. > duck.swim(); // Output: The bird swims in the pond. > } >} >```

Java Interface

Java Factory Method