Übungsaufgaben
- https://silhding.github.io/2020/04/05/java/
- https://silhding.github.io/2020/04/13/java2/
- https://silhding.github.io/2020/04/17/java3/
WireCard-Beispiel
Stichwörter: Kapselung
, Getter
- und Setter
-Methoden
public class Wirecard {
public static void main(String[] args) {
System.out.println("Willkommen in unserem HOCHSERIÖSEN Bankhaus");
Konto sigmaKonto = new Konto("Sinan Oturucu", 69); // Erstellen eines neuen Konto-Objekts (Konstruktor wird aufgerufen)
sigmaKonto.geldEinzahlen(420);
sigmaKonto.geldEinzahlen(-88000); // Buchung wird wegen "if"-check im setter nicht durchgeführt
System.out.println(sigmaKonto.getKontostand());
System.out.println(sigmaKonto.kontonummer); // kontonummer nicht abrufbar, weil sie auf private gesetzt ist
double geldFuerDenPuff = sigmaKonto.abbuchen(300); // "abbuchen" methode ist nicht definiert
}
}
class Konto {
private String inhaber;
private int kontonummer;
private double kontostand;
public Konto(String inhaber, int kontonummer) {
this.inhaber = inhaber;
this.kontonummer = kontonummer;
this.kontostand = 0;
}
public String getInhaber() {
return this.inhaber;
}
// SETTER-Methode für den Kontostand
public void geldEinzahlen(double einzahlungsBetrag) {
if (einzahlungsBetrag > 0) {
this.kontostand += einzahlungsBetrag;
}
}
// GETTER-Methode für den Kontostand
public double getKontostand() {
return this.kontostand;
}
}
Mehrfache Vererbung
- Ist mehrfache Vererbung (wie im gegebenen Beispiel) in Java möglich? Begründen Sie ihre Antwort.
abstract class Animal {
abstract void makeNoise();
}
class Cat extends Animal {
@Override
void makeNoise() {
System.out.println("miau");
}
}
class Dog extends Animal {
@Override
void makeNoise() {
System.out.println("wuff");
}
}
class Cog extends Cat, Dog {
void goCrazy() {
System.out.println("AAAAAAAAAAAAAAAAAAHHHH");
}
}
- Antwort
Nein, Grund dafür ist das Verhindern von Konflikten wie dem Diamantenproblem: Bei mehrfacher Vererbung wäre es grundsätzlich möglich, dass wenn eine Klasse von mehreren Klassen erbt, die die gleichen Methoden enthalten, es zu einem Nutzungskonflikt der Superklassenmethoden in der neuen Subklasse kommt.
Objektorientierung
Encapsulation
Kapselung bedeutet, dass Objektdetails vor der Außenwelt verborgen und nur über definierte Schnittstellen zugänglich gemacht werden. Dies schützt die Daten und kontrolliert den Zugriff.
Beispiel
public class BankAccount {
// Private Variablen können nur innerhalb der Klasse direkt zugegriffen werden
private double balance;
private String accountNumber;
// Öffentliche Methoden erlauben kontrollierten Zugriff
public void deposit(double amount) {
// Validierung vor der Änderung des Kontostands
if (amount > 0) {
balance += amount;
}
}
public double getBalance() {
// Kontrollierter Zugriff auf den Kontostand
return balance;
}
}
Abstraction
Abstraktion bedeutet, komplexe Implementierungsdetails zu verbergen und nur die wesentlichen Merkmale eines Objekts zu zeigen.
Beispiel
// Abstrakte Klasse definiert ein Grundmuster für Fahrzeuge
public abstract class Vehicle {
// Abstrakte Methode, die von Unterklassen implementiert werden muss
public void move();
// Gemeinsame Methode für alle Fahrzeuge
public void startEngine() {
System.out.println("Engine started");
}
}
// Konkrete Implementierung
public class Car extends Vehicle {
@Override
public void move() {
System.out.println("Car is driving");
}
}
public class Boat extends Vehicle {
@Override
public void move() {
System.out.println("Boat is sailing");
}
}
Inheritance
Vererbung ermöglicht es, Eigenschaften und Methoden von einer Klasse an eine andere weiterzugeben.
Beispiel
public class Animal {
protected String name;
public void eat() {
System.out.println(name + " is eating");
}
}
public class Dog extends Animal {
public Dog(String name) {
// Zugriff auf Elternklassen-Attribut
this.name = name;
}
// Zusätzliche spezifische Methode
public void bark() {
System.out.println(name + " is barking");
}
}
Polymorphism
Polymorphie erlaubt es, dass Objekte unterschiedlich auf die gleiche Methode reagieren können.
Beispiel
abstract class Shape {
// Polymorphe Methode zur Berechnung der Fläche
abstract double calculateArea();
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
}
// Demonstration der Polymorphie
public class Main {
public static void printArea(Shape shape) {
System.out.println("Fläche: " + shape.calculateArea());
}
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
// Gleiche Methode, verschiedene Implementierungen
printArea(circle); // Berechnet Kreisfläche
printArea(rectangle); // Berechnet Rechteckfläche
}
}
Komposition
→ Interfaces, flexiblere Vererbung