JAVA-B1
Klassen
public class
instance
System.out.println()
{@link Klasse}
{@param Klasse}
getClass().getSimpleName()
extends
Objekte
Interfaces
FAQ classes
Erweitern von Klassen mit extends
finale Konstanten
(@see
Finalisierung von Klassen
)
Polymorphismus
Nested Classes
@Override Annotation
innere Klassen
lokale Klassen
anonyme Klassen
Lamda Expressions
FAQ Nested Classes
Klassen im Detail
Overview
return-Statements
return & void
return bei primitiven Typen
return bei Objekten
return-Statements von Methoden mit/ohne return
Rückkehr ohne return
Rückkehr über return
throws Exception
Kopie oder Referenz
Covariant Return Types
this
this mit Objekt-Feldern
this mit Methoden und im Konstuktor
Zugriffsmodifikatoren
public protected private
Class Member
static
public static final PI
Initialisierung
Initialisierung von Feldern
Initialisierung von Klassenfeldern
Static Block
Lambda-Expressions
Methoden-Referenzen
Enumerationen und enum-Types
Enumerationskonstanten
Enumerationen mit Werten
Samstag/Sonnabend Example @!
Enumerationen FAQ
Enum @!Descr/Exmpl/Index
Interfaces
Einfache Interfaces (Marker)
Interfaces mit Methoden
Default-Methoden
static
Interfaces FAQ
Vererbung / Inheritance
Vererbung / Inheritance
super Keyword
method-overriding-and-hiding
hiding-of-fields
object-as-superclass
Finalisierung
Finale Klassen und Methoden
Finale Methoden
Finale Utility-Klasse "IdGenerator"
"Template-Methode"-Pattern
DataProcessor process(){ r(), p(), w() }
Composition-over-Inheritance
abstract
Abstrakte Klassen und Methoden
Beispiel
Abstrakte Klassen und Methoden
abstract
Implementierungsklassen
FAQ Vererbung
Kein this in super(..)
Verhindern Überschreiben von Membern
Generics
Generische Programmierung
Generische Typparameter
Generische Klassen
Generische Interfaces
Generische Methoden
Generische Felder
Generische Collection (ArrayList)
Diamond Operator
Generische Arrays
Example
Beispiel "GenerischerSpeicher"
Ring-Speicher-Algorithus mit generischem Array
Beispiel: GenerischePerson mit Berufsgruppe
Beispiel: Berufsgruppe mit Static/Non-Static Nested Classes
Modularisierung
Package
Overview
Package Structure
Package Info
Modules
Overview
Setup
Setup
Module Info
Java New Features Java 8+
Java Record
Record Syntax
Record Demo
Herkömmliche POJOs
Lösung mit Records
Records Zusammenfassung
INDEX
abstract
abstract | Abstrakte Klassen und Methoden
In diesem Themenblock befassen wir uns mit dem Schreiben finaler Klassen und Methoden sowie Verfahren, wie man ab JAVA 17 Klassen und Methoden versiegeln kann, diesen Schutz aber für ausgewählte Klassen aber wiederum erlauben kann.
Das Finalisieren und Schützen von Klassen und Methoden ist insbesondere für Utility-Klassen sowie für Methoden zweckmäßig, welche direkt aus Konstruktoren aufgerufen werden.
Beispiel
abstract | Beispiel
Das nachfolgende Beispiel zeigt die Verwendung abstrakter Klassen und Methoden.
Finale abstrakte Klassen machen in diesen Kontext also eher keinen Sinn.
package com.stuelken.java.b1.finalization;
public class QuadratDEMO {
/**
* DEMO
*
* @param args
*/
public static void main(String[] args) {
Quadrat q = new Quadrat(123.45);
System.out.println(q.getKanteX());
System.out.println(q.getKanteY());
q.setKanteX(100.00);
System.out.println(q.getKanteX());
System.out.println(q.getKanteY());
System.out.println();
QuadratWuerfel box = new QuadratWuerfel(234.56);
System.out.println(box.getKanteX());
System.out.println(box.getKanteY());
System.out.println(box.getKanteZ());
box.setKanteZ(200);
System.out.println(box.getKanteX());
System.out.println(box.getKanteY());
System.out.println(box.getKanteZ());
System.out.println();
QuadratWuerfel standard = new QuadratWuerfel();
System.out.println(standard.getKanteX());
System.out.println(standard.getKanteY());
System.out.println(standard.getKanteZ());
box.setKanteZ(200);
System.out.println(standard.getKanteX());
System.out.println(standard.getKanteY());
System.out.println(standard.getKanteZ());
}
}
Im Hauptprogramm wird jeweils eine Instanz von Quadrat beziehungsweise vom Würfel erzeugt erzeugt. Wir können die Abmessungen im Konstruktor setzen sowie aber auch nachträglich über set-Methoden verändern.
Ändert man eine der Kantenabmessungen in X-, Y- oder Z-Richtung, hat man bei einem Zugriff auf die Getter-Methoden anschließend in jeder Richtung die neue Abmessung.
package com.stuelken.java.b1.finalization;
/**
* Ein Objekt der {@link Quadrat} Klasse hat zwei Dimensionen
* in X- und in Y-Richtung.
*
* Es ist zwar möglich, eine Subklasse wie beispielsweise
* {@link QuadratWuerfel} mit einer dritten Dimension in
* z-Richtung zu programmieren, aber damit die Abmessungen
* in allen Richtungen immer gleich sind, wird ein
* direkter Zugriff auf {@link #abmessung} sowie
* ein Überschreiben von Methoden verhindert.
*
* @author t2m
*
*/
public class Quadrat {
/**
* @param abmessung Wert für Höhe und Breite
*/
public Quadrat(double abmessung) {
this.abmessung = abmessung;
}
private double abmessung = 0.0;
protected final void setAbmessung(double abmessung) {
this.abmessung = abmessung;
}
protected final double getAbmessung() {
return this.abmessung;
}
public final double getKanteX() {
return this.abmessung;
}
public final double getKanteY() {
return this.abmessung;
}
public final void setKanteX(double x) {
this.abmessung = x;
}
public final void setKanteY(double y) {
this.abmessung = y;
}
}
Alle Methoden sind bis auf den Konstruktor final deklariert, dh. wir können quas die Klasse um eine Subklasse erweitern, aber ein Überschreiben der Methoden ist nicht möglich.
package com.stuelken.java.b1.finalization;
/**
* Die {@link QuadratWuerfel} erweitert ein zwei-dimensionales {@link Quadrat}
* um eine dritte Dimension in Z-Richtung.
*
* @author t2m *
*/
public class QuadratWuerfel extends Quadrat {
/**
* Konstruktor mit dessen Hilfe die ersten zwei Dimensionen belegt werden.
*
* @param abmessung
*/
public QuadratWuerfel(double abmessung) {
super(abmessung);
this.abmessung = 12;
}
public QuadratWuerfel() {
// super(this.abmessung); // Cannot refer to 'this' nor 'super' while explicitly
// invoking a constructor
super(0);
this.setAbmessung(this.abmessung);
}
public final double getKanteZ() {
return this.getAbmessung();
}
public final void setKanteZ(double z) {
this.setAbmessung(z);
}
private int abmessung = -13;
/*
* Cannot override final method public void setKanteX(double x) {
*
* }
*/
}
Obwohl alle Methoden final deklariert wurden
und damit nicht überschrieben werden können,
haben wir dennoch die Möglichkeit, ein
Feld abmessung
hier statt mit double mit int neu zu definieren.
Zusammenfassung
abstract | Zusammenfassung
Abstrakte Klassen und abstrakte Methoden werden mit Hilfe des Keywords
abstract deklariert und führen dazu,
dass mit Hilfe einer Klasse, die entweder selbst schon abstrakt ist
oder aber nur eine einzige abstrakte Methode besitzt, keine Objekt
erzeugt werden können. Man muss diese Klasse zwingend durch eine
sogenannte Implementierungsklasse weitern.
Finale abstrakte Klassen machen in diesen Kontext also eher keinen Sinn.
Mehr Infos zum Thema:
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
FootNotes, Keywords, Tags
Hinweise, Rechte, Marken
UIO3 Es ist einfacher als Du denkst.
Stelle noch heute Deine Anfrage.
