Statische Attribute und Methoden

Video

Mit dem Laden des Videos akzeptierst du die Datenschutzerklärung von YouTube. Wenn du die Menge an Daten reduzieren möchtest, die YouTube von dir sammelt, solltest du dich vorher aus deinem YouTube-Account ausloggen, das Speichern von Cookies für das Google-Ads-Programm deaktivieren und/oder Cookies im Browser blockieren.

YouTube immer automatisch laden
Inhaltsverzeichnis
Als Text lesen

Wie du weißt, hat jedes ausführbare Java-Programm eine main Methode:

public static void main(String[] args) {
// ...
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Du kennst bereits die Bedeutung fast aller Keywords und Namen:

  • public: Die Methode ist aus anderen Klassen sichtbar
  • void: Die Methode hat keinen Rückgabewert
  • main: Die Methode heißt main
  • String[]: Es gibt einen Parameter des Typs String-Array (also mehrere Text-Variablen)
  • args: Dieser Parameter heißt args

Aber was zur Hölle heißt dieses static?

static ist ein Keyword, das es (entgegen klassischer Konventionen der Objektorientierten Programmierung) erlaubt, ein Attribut oder eine Methode unabhängig von seiner Klasse zu machen.

Beispiel: Statische Attribute

public class User {
public static int totalNumberOfUsers;
public User() {
totalNumberOfUsers++;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

In dieser Klasse gibt es das statische Attribut totalNumberOfUsers. Man nennt solche Attribute (statt Objektattribut) dann auch Klassenattribut.

Bei jedem Aufruf des Konstruktors wird dieses Klassenattribut inkrementiert. Da totalNumberOfUsers static ist, existiert nicht jeweils ein Wert für jedes existierende User Objekt, sondern ein einziger Wert für alle Objekte.

Statische Methoden

Es gibt (offensichtlich) auch statische Methoden. Diese benötigen kein existierendes Objekt der Klasse, in der sie implementiert sind. Stattdessen können sie direkt über den Namen der Klasse aufgerufen werden:

public class MathUtil {
public static double square(double x) {
return x * x;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

In dieser Klasse könnte die Methode square() beispielsweise über MathUtil.square(42.0) aufgerufen werden, ohne dass jemals ein Objekt der Klasse MathUtil existieren muss.

Und jetzt kommt das ABER

Ich möchte dich auf folgende, nicht repräsentative Statistik hinweisen:

In 99% aller Fällen sollte dein Attribut nicht static sein.

Statische Attribute zerreißen die Grundidee der objektorientierten Programmierung, dass jedes "Ding" ein Objekt ist, und jedes Objekt aus Attributen mit eigenen Werten besteht. Ein statisches Attribut hat nichts mit den einzelnen Instanzen der Klasse zu tun.

Im obigen Beispiel mit der Klasse User wäre es also besser, die Anzahl der existierenden Objekte in der Klasse zu zählen, in der die Instanzen auch erstellt werden. Dann könnte man sich das static sparen.

Eine Ausnahme, in der es völlig legitim sein kann, statische Attribute zu deklarieren, ist bei Konstanten:

public class SuperFancyAlgorithm {
public static final double SQRT_2_HALF = Math.sqrt(2.0) / 2.0;
// ...
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Statische Konstanten sollten in Java immer in Großbuchstaben und durch Unterstriche getrennt benannt werden.

Übrigens: Die Verwendung statischer Methoden ist deutlich gängiger. Aber auch hier solltest du dir immer die Frage stellen, ob diese Methode jetzt wirklich mit genau der Klasse zusammenhängt, in der du sie implementierst. Deine statische Methode könnte schließlich auch in jeder anderen Klasse stehen.

Beispiele, wo du statische Attribute / Methoden schon kennengelernt hast

  • public static void main(String[] args): Die main Methode muss statisch sein, damit sie ohne Existenz eines Objekts ausgeführt werden kann.
  • System.out.println(): Die Klasse System enthält das statische Attribut out, was wiederum eine Instanz der Klasse java.io.PrintStream ist, die die Methode println() enthält.
  • Math.sqrt() und ähnliche statische Methoden können aufgerufen werden, ohne dass es ein Objekt der Klasse Math geben muss.

Wie du bereits weißt, sind double Werte in Java nicht exakt. Wir wollen nun eine Klasse Rational erstellen, die es uns ermöglicht, mit exakten rationalen Zahlen zu rechnen.

Eine rationale Zahl besteht aus einem Zähler (numerator) und einem Nenner (denominator), die beide Ganzzahlen sind. Der Nenner darf dabei nicht 0 sein.

Deine Aufgabe ist es, die folgenden Methoden zu implementieren:

  • Rational fromLong(long l) bekommt eine Ganzzahl übergeben und konvertiert diese in ein neues Rational Objekt, sodass z.B. aus der Zahl 7L der Bruch 7/1 wird
  • Rational mul(Rational r) multipliziert die eigene Instanz mit r und gibt das Ergebnis als neue Instanz zurück
  • Rational div(Rational r) dividiert die eigene Instanz durch r und gibt das Ergebnis als neue Instanz zurück
  • Rational add(Rational r) addiert die eigene Instanz mit r und gibt das Ergebnis als neue Instanz zurück
  • Rational sub(Rational r) subtrahiert r von der eigenen Instanz und gibt das Ergebnis als neue Instanz zurück
  • double toDouble() konvertiert den Bruch zu einer (ggf. fehlerbehafteten) Fließkommazahl
  • String toString() erzeugt beispielsweise für den Bruch 3/4 den String "3/4"

Außerdem sollst du die folgenden Brüche als konstante Attribute der Klasse hinzufügen:

  • ZERO (0)
  • ONE_TENTH (1/10)
  • ONE_HALF (1/2)
  • ONE (1)
  • TWO (2)
  • TEN (10)

Entscheide hierbei jeweils, ob die Methode bzw das Attribut static sein sollte oder nicht.

Formeln zur Verrechnung zweier Brüche

fraction_calculations.svg

Die Methode reduce() ist bereits implementiert und kürzt den jeweiligen Bruch maximal. Die Funktionsweise dieser Methode ist nicht relevant.

Du kannst diese Aufgabe entweder online oder in deiner IDE bearbeiten.

Online Editor

Mit dem Laden des Online Editors akzeptierst du die Datenschutzerklärung von JDoodle, einem Produkt der Nutpan pty Ltd (Australien). JDoodle verwendet die Tools reCAPTCHA und Google Analytics, wodurch Daten an Google übertragen werden können. Ich habe leider keinen Einfluss auf diesen Prozess. Du kannst Google Analytics über ein Browserplugin deaktivieren.

Online Editor immer automatisch laden

Die Konsolenausgabe sollte so aussehen:

42 als Bruch ist 42/1
1/2 + 3/4 = 5/4
1/2 - 3/4 = -1/4
1/2 * 3/4 = 3/8
(1/2) / (3/4) = 2/3
7/4 als Fließkommazahl ist 1.75
0.7 + 0.2 = 0.8999999999999999
7/10 + 2/10 = 9/10

Häufige Fehlerquellen
  • Instanzen verwechselt oder Reihenfolge verdreht (z.B. this statt r)
  • static fehlt oder ist überflüssig
  • Ganzzahldivision statt Fließkommadivision bei toDouble()
Lösungsvorschlag
public class Rational {
// Statische Konstanten (Existieren unabhängig von einer einzelnen Rational Instanz)
public static final Rational ZERO = new Rational(0L, 1L);
public static final Rational ONE_TENTH = new Rational(1L, 10L);
public static final Rational ONE_HALF = new Rational(1L, 2L);
public static final Rational ONE = new Rational(1L, 1L);
public static final Rational TWO = new Rational(2L, 1L);
public static final Rational TEN = new Rational(10L, 1L);
private final long numerator;
private final long denominator;
public Rational(long numerator, long denominator) {
if (denominator < 0L) {
numerator *= -1L;
denominator *= -1L;
}
this.numerator = numerator;
this.denominator = denominator;
}
/*
* Statische Methode, weil hier ein Rational Objekt erstellt wird,
* ohne dass vorher schon eine Instanz existieren muss. Dadurch kann
* man später z.B das hier machen:
*
* Rational seven = Rational.fromLong(7L);
*/
public static Rational fromLong(long l) {
return new Rational(l, 1L); // Jede ganze Zahl ist gleich sich selbst geteilt durch 1
}
/*
* Die arithmetischen Methoden sind nicht static, weil man hier die
* existierende (eigene) Instanz als linken Operanden verwendet.
*/
public Rational mul(Rational r) {
return new Rational(this.numerator * r.numerator, this.denominator * r.denominator);
}
public Rational div(Rational r) {
return new Rational(this.numerator * r.denominator, this.denominator * r.numerator);
}
public Rational add(Rational r) {
return new Rational(this.numerator * r.denominator + r.numerator * this.denominator,
this.denominator * r.denominator);
}
public Rational sub(Rational r) {
return new Rational(this.numerator * r.denominator - r.numerator * this.denominator,
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dir gefällt meine Arbeit?

Unterstütze Mich

Interesse an einer Zusammenarbeit?


  • Entwicklung von Desktopanwendungen
  • Datenanalyse & Machine Learning
  • Automatisierte Datenverarbeitung

>> timofriedl.com <<

AllgemeinSocialRechtliches
PortfolioInstagramDatenschutz
HomeYouTubeImpressum
ÜberTikTok
Ko-fi

Made with love by a former noob.

© 2022-2025 Timo Friedl