algodat-java-intro/docs/04_introduction_to_objects.md

8.7 KiB

04: Einführung in Objekte

Kurze Begriffserklärung

Quelle: stackhowto.com

Declaration

Declaring a variable means the first “mention” of the variable, which tells the compiler “Hello, I am here and can be used”. In a statically typed language like Java, this also means that the declared type of the variable is determined. The value itself is not determined during the declaration.

String name;
int nbr;

Initialization

The term initialization usually means the first assignment of a value to a variable.

String name = "Thomas";
int nbr = 5;

Instantiation

The term instantiation actually has nothing to do with assigning a value to a variable, even if a new object is sometimes instantiated when a variable is initialized. The term simply means the creation of a new object, i.e. an instance, from a class.

String name = new String("Thomas");

Modifier

Quelle: w3schools.com

Access-Modifier

Modifier Beschreibung
public The code is accessible for all classes
private The code is only accessible within the declared class
protected The code is accessible in the same package and subclasses.
default The code is only accessible in the same package. This is used when you don't specify a modifier.

Non-Access-Modifier

Modifier Beschreibung
final The class cannot be inherited by other classes
abstract The class cannot be used to create objects (To access an abstract class, it must be inherited from another class.

#1 Einfache Objekte und Veerbung

Lernziele:

  • eine Klasse erzeugen
  • eine Klasse aufrufen
  • einfache Veerbung
  • Polymorphie (Überschreiben von Methoden)
  • die Verwendung von this
  • die Verwendung von super
// main.java
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        myAnimal.makeSound();

        Dog myDog = new Dog();
        myDog.makeSound();

        Cat myCat = new Cat();
        myCat.makeSound();

        myCat.compareToAnimal();
    }
}
// Animal.java
public class Animal {
    public boolean isPet;

    public Animal() {
        System.out.println("## in constructor of Animal");
        this.isPet = false; // it doesn't exist for our cats or dogs
    }

    public void makeSound() {
        System.out.println("Yes, animal usually make sounds");
    }

}
// Cat.java
public class Cat extends Animal {

    public Cat() {
        System.out.println("## in constructor of Cat");
        this.isPet = true;
    }

    @Override
    public void makeSound() {
        System.out.println("meow meow");
    }

    public void compareToAnimal() {
        System.out.println("--- Animal ---");
        super.makeSound();
        System.out.println("is alive: " + super.isPet);

        System.out.println("--- Cat ---");
        this.makeSound();
        System.out.println("is alive: " + this.isPet);
    }
}
// Dog.java
public class Dog extends Animal {

    public Dog() {
        System.out.println("## in constructor of Dog");
        this.isPet = true;
    }
    
    @Override
    public void makeSound() {
        System.out.println("woof woof");
        this.isPet = true;
    }

    public void compareToAnimal() {
        System.out.println("--- Animal ---");
        super.makeSound();
        System.out.println("is alive: " + super.isPet);

        System.out.println("--- Cat ---");
        this.makeSound();
        System.out.println("is alive: " + this.isPet);
    }

}

#2 komplexere Vererbung von Klassen

Lernziele:

  • Erweiterte Veerbung
  • Modifikatoren für Attribute
  • Getter und Setter
  • Konstruktorverkettung
// main.java
public class Main {
    public static void main(String[] args) {
        Vehicle myVehicle = new Vehicle();
        System.out.println("-- myVehicle:");
        System.out.println("number of wheels: " + myVehicle.getNumberOfWheels());
        System.out.println("max Speed: " + myVehicle.getMaxSpeed());
        myVehicle.setMaxSpeed(150);
        System.out.println("max Speed: " + myVehicle.getMaxSpeed());

        Car myCar = new Car("blue");
        System.out.println("-- myCar:");
        System.out.println("number of wheels: " + myCar.getNumberOfWheels());
        System.out.println("max Speed: " + myCar.getMaxSpeed());
        myVehicle.setMaxSpeed(150);
        System.out.println("max Speed: " + myCar.getMaxSpeed());
    }
}
public class Vehicle {
    protected int numberOfWheels;
    protected int maxSpeed;

    public Vehicle() {
        System.out.println("## in default constructor of Vehicle");
        this.numberOfWheels = 4;
        this.maxSpeed = 100;
    }

    public Vehicle(int numberOfWheels, int maxSpeed) {
        System.out.println("## in constructor of Vehicle");
        this.numberOfWheels = numberOfWheels;
        this.maxSpeed = maxSpeed;
    }

    public int getNumberOfWheels() {
        return this.numberOfWheels;
    }

    public int getMaxSpeed() {
        return this.maxSpeed;
    }

    public String printMaxSpeed() {
        return this.maxSpeed + " km/h";
    }

    public void setMaxSpeed(int newMaxSpeed) {
        if (newMaxSpeed < 0) {
            return;
        }
        this.maxSpeed = newMaxSpeed;
    }

}
public class Car extends Vehicle {
    private String color;

    public Car(String color) {
        super(4, 200); // always needs to be the first statement
        System.out.println("## in constructor of Car");
        this.color = color;
    }

    @Override
    public void setMaxSpeed(int newMaxSpeed) {
        if (newMaxSpeed < 1000) {
            System.out.println("No car shall be this slow tbh");
            return;
        }
        this.maxSpeed = newMaxSpeed;
    }
}
public class Car extends Vehicle {
    private String color;

    public Car(String color) {
        super(4, 200); // always needs to be the first statement
        System.out.println("## in constructor of Car");
        this.color = color;
    }

    @Override
    public void setMaxSpeed(int newMaxSpeed) {
        if (newMaxSpeed < 1000) {
            System.out.println("No car shall be this slow tbh");
            return;
        }
        this.maxSpeed = newMaxSpeed;
    }
}
public class Truck extends Vehicle {
    private boolean isFireTruck;
    private final String hornSound;

    public Truck(boolean isFireTruck) {
        super(4, 200); // always needs to be the first statement
        System.out.println("## in constructor of Truck");
        this.isFireTruck = isFireTruck;
        this.hornSound = "test";
    }

    public boolean getIsFireTruck() {
        return this.isFireTruck;
    }
}

#3 static in einer Klasse

Lernziele:

  • statische und dynamische Variablen
  • statische und dynamische Methoden
// main.java
public class Main {
    public static void main(String[] args) {
        Counter.printCounterStatic("Static");
        Counter.increaseCounterStatic();
        Counter.printCounterStatic("Static");

        Counter myCounter = new Counter();
        Counter.increaseCounterStatic();
        myCounter.increaseCounterDynamic();
        myCounter.printCounterDynamic("Dynamic");
    }
}
public class Counter {
    static int counterValueStatic = 0;
    int counterValueDynamic = 0;

    public static void increaseCounterStatic() {
        counterValueStatic++;
    }

    public void increaseCounterDynamic() {
        this.counterValueDynamic++;
    }

    public void printCounterDynamic(String classID) {
        System.out.println(">> execute printCounterDynamic of class " + classID);
        System.out.println("static: " + counterValueStatic);
        System.out.println("dynamic: " + this.counterValueDynamic);
    }

    public static void printCounterStatic(String classID) {
        System.out.println(">> execute printCounterStatic of class " + classID);
        System.out.println("dynamic: " + counterValueStatic);
    }
}