Statische Attribute und Methoden
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 ladenInhaltsverzeichnis
Als Text lesen
Wie du weißt, hat jedes ausführbare Java-Programm eine main Methode:
Du kennst bereits die Bedeutung fast aller Keywords und Namen:
public: Die Methode ist aus anderen Klassen sichtbarvoid: Die Methode hat keinen Rückgabewertmain: Die Methode heißt mainString[]: Es gibt einen Parameter des TypsString-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
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:
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:
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): DiemainMethode muss statisch sein, damit sie ohne Existenz eines Objekts ausgeführt werden kann.System.out.println(): Die KlasseSystementhält das statische Attributout, was wiederum eine Instanz der Klassejava.io.PrintStreamist, die die Methodeprintln()enthält.Math.sqrt()und ähnliche statische Methoden können aufgerufen werden, ohne dass es ein Objekt der KlasseMathgeben 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 neuesRationalObjekt, sodass z.B. aus der Zahl7Lder Bruch 7/1 wirdRational mul(Rational r)multipliziert die eigene Instanz mitrund gibt das Ergebnis als neue Instanz zurückRational div(Rational r)dividiert die eigene Instanz durchrund gibt das Ergebnis als neue Instanz zurückRational add(Rational r)addiert die eigene Instanz mitrund gibt das Ergebnis als neue Instanz zurückRational sub(Rational r)subtrahiertrvon der eigenen Instanz und gibt das Ergebnis als neue Instanz zurückdouble toDouble()konvertiert den Bruch zu einer (ggf. fehlerbehafteten) FließkommazahlString toString()erzeugt beispielsweise für den Bruch 3/4 denString"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
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.
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 ladenDie 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.
thisstattr) staticfehlt oder ist überflüssig- Ganzzahldivision statt Fließkommadivision bei
toDouble()
Lösungsvorschlag
Interesse an einer Zusammenarbeit?
- Entwicklung von Desktopanwendungen
- Datenanalyse & Machine Learning
- Automatisierte Datenverarbeitung