uio--WebPageMain-Module

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

    UI ORGANIZED.

    UIO3 Es ist einfacher als Du denkst.

    Stelle noch heute Deine Anfrage.

    uio--WebPageFooter-Module