Warum ist dieses Feld der Klasse Math immutable?

Maik.Neumann

Aktives Mitglied
Hallo,

Ich hätte da mal eine Frage zu der Klasse Math in Java. Es existiert hier ja eine Konstante namens PI, die mit Math.PI aufgerufen wird.

Warum könnte jetzt eine andere Klasse nicht einfach dieses Feld in dieser Klasse überschreiben?

Java:
double d = Math.PI; // hier zeigen MATH.PI und d auf ein- und denselben primitiven Datentyp
d = 8.99; // warum zeigen jetzt d und MATH.PI auf unterschiedliche primitive Datentypen?
Danke und Gruß
 

Joose

Top Contributor
Java:
double d = Math.PI;

Sorgt nur dafür das
Code:
d
der selbe Wert (nicht der gleiche!) wie
Code:
Math.PI
zugewiesen wird.


Java:
d = 8.99;

Hier änderst du den Wert von
Code:
d
wieder auf etwas anderes, Math.PI hat keine Verbindung mit deinem
Code:
d
daher bleibt der Wert gleich!
 

Bug Fisher

Bekanntes Mitglied
In Java wird unterschieden zwischen Referenzen und Primitiven.
Primitive werden stets kopiert.

Math.PI ist aber ein double statt Double.
Soweit so gut... :)

Double ist zudem immutable, daher ergäbe sich ohnehin der selbe Effekt, als wenn es ein primitiver Wert wäre.
(const ist in Java zwar ein reserviertes Wort, wird aber (noch) nicht genutzt. Deshalb bedient man sich des Immutable-Patterns, da final keine konstanten Objektzustände garantiert)

OO heisst auch Kapselung; keiner, der das ausreichend begriffen hat, wird (GERADE BEI EINER KONSTANTEN) einen dermassen großen Unsinn fabrizieren, ein zustandsmanipulierbares Objekt öffentlich zugänglich zu machen.

Selbst wenn ich eine Klasse bauen müsste, die ein PI öffentlich statisch zur Verfügung stellt, der Typ ein Double sein müsste und Double nicht immutable wäre :), würde ich eine sogenannte defensive Kopie erstellen.

Java:
class Assumed {
    private static final Double PI = ... ; //assumed Double wouldn't be immutable
   
    private Assumed() {}

    public static Double getPi() {
        return new Double(PI.doubleValue);
    }
 }
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Um auf die ursprüngliche Frage zurückzukommen: Math.PI ist immutable, damit niemand auf die Idee kommt PI zu verändern. PI ist eine, soweit bekannt, universumweite Konstante, die sich nie ändern wird. Deshalb macht es überhaupt keinen Sinn Math.PI mutable zu machen. Außerdem ist diese Variable statisch, was bedeutet, dass eine Änderung Auswirkungen auf ALLE Operationen haben wird, die auf Math.PI zugreifen.
 

Anti-Banane

Gesperrter Benutzer
@TO

ich glaube was du hier nicht verstehst ist folgendes :

du hast in deiner klasse eine referenz "d"

dieser referenz wird die speicher-adresse von Math.PI zugewiesen ... so das dein "d" letzten endes auf genau den speicher zeigt wo durch die Math-klasse PI angelegt wurde

ein paar zeilen später weist du deiner referenz "d" eine andere speicher-adresse zu ... heißt also : dein "d" zeigt dann auf eine andere stelle im speicher


Math.PI selbst bleibt davon aber völlig unberührt und zeigt weiterhin auf genau die stelle im speicher in halt PI erstellt wurde


java ist grundsätzlich call-by-value ... es wird also indern nur mit den speicher-adressen gearbeitet auf die eine referenz zeigt


das was du willst ... über einen eigenen namen etwas fremdes zu verändern würde z.b. in C mit den dort vorhandenen pointern gehen : *d=8.99
das sternchen in C bedeutet das man nicht die adresse ändern will auf die ein pointer zeigt sondern inhalt in dieser speicher-zelle ... was dann call-by-reference wäre ... und genau DAS geht in java zum glück nicht
 

Maik.Neumann

Aktives Mitglied
Hallo nochmal,

Wäre Math.PI jetzt aber ein Objekt einer beliebigen Klasse, so wäre es aber nicht immutable.

Kann man allgemein sagen, dass Konstanten in Form von primitiven Datentypen, die als final (oder auch static final) deklariert wurden, automatisch immutable sind und beliebige Klasse nicht automatisch immutable sind, auch wenn sie static final oder nur final deklariert wurden?

Danke und Gruß
 

Gucky

Top Contributor
Alle Elemente, die als final gekennzeichnet sind, sind unveränderbar.
Math.PI ist deshalb immutable, weil es final ist.
Z. B. Strings sind auch immutable, was daran liegt, dass sie keine Setter für ihren Inhalt haben.

Deshalb kann, wenn Math.PI ein Element einer beliebigen Klasse wär, Math.PI auch dort immutable sein, so es als final gekennzeichnet ist.


War es das, was du meintest?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
cmn489 Werte beim Funktionsaufruf in ein Feld übertragen(falls dieses leer ist) Java Basics - Anfänger-Themen 1
Temsky34 Wie bekomme ich dieses Java-Warning wieder weg? Java Basics - Anfänger-Themen 2
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
Salvatore321 Wie kann ich dieses Zustandsdiagramm am besten Umsetzen? Java Basics - Anfänger-Themen 5
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
M Wie erstelle ich dieses Parallelogramm??? Java Basics - Anfänger-Themen 6
P Wie kann ich die Zahlen dieses Arrays dividieren? Java Basics - Anfänger-Themen 2
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
A Kann mir jemand dieses Programm erklären? Java Basics - Anfänger-Themen 1
ChrisPL4Y Wieso funktioniert dieses Programm nicht? Java Basics - Anfänger-Themen 6
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
TechGirl JAVA GUI Oberfläche Umkreisung - wie heißt dieses Element? Java Basics - Anfänger-Themen 2
W Methoden Methode auf Array aufrufen, und dieses Array dabei ändern? Java Basics - Anfänger-Themen 10
Tacofan Was macht dieses "Stückchen Code"? Java Basics - Anfänger-Themen 3
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
R Wieso funktioniert dieses Array nicht? Java Basics - Anfänger-Themen 13
M Wie heisst dieses Sortierverfahren? Java Basics - Anfänger-Themen 6
G Wo ist die Eigenschaft dieses JFrames versteckt? Java Basics - Anfänger-Themen 5
G Wie nennt man dieses Konstrukt Java Basics - Anfänger-Themen 3
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
F Was soll dieses Programm genau machen ? Java Basics - Anfänger-Themen 9
P OOP Wie schreib ich dieses Programm am besten? Java Basics - Anfänger-Themen 6
D Was genau bedeutet und bewirkt dieses @override? Java Basics - Anfänger-Themen 15
P Datentypen Warum würde dieses Beispiel nicht funktionieren? Java Basics - Anfänger-Themen 6
G Aus eigenem Panel dieses Löschen Java Basics - Anfänger-Themen 2
S für was steht dieses e ?? Java Basics - Anfänger-Themen 4
J Was bedeutet dieses a [i].length? Java Basics - Anfänger-Themen 3
D Wie bringe ich dieses Programm als .jar zum laufen ? Java Basics - Anfänger-Themen 12
R Image aus jar laden (dieses mal awt) Java Basics - Anfänger-Themen 19
W "Sprechen Sie Java?" suche dieses Buch gebraucht! Java Basics - Anfänger-Themen 11
G Dieses verdammte Regex Java Basics - Anfänger-Themen 2
H warum ist dieses Kontext static? Java Basics - Anfänger-Themen 5
G Dieses leidige ID Thema Java Basics - Anfänger-Themen 9
D Was ist denn dieses Jar ueberhaupt ? Java Basics - Anfänger-Themen 3
G Wie nennt man dieses Konstrukt: Vector<Object> Java Basics - Anfänger-Themen 2
N Ist dieses Problem mit Java zu lösen? Java Basics - Anfänger-Themen 7
C Warum funktioniert dieses Speichern in Array nicht? Java Basics - Anfänger-Themen 4
S Ist dieses Projekt realisierbar? Java Basics - Anfänger-Themen 2
D Warum läuft dieses Programm so langsam? Java Basics - Anfänger-Themen 5
B Split und dieses Zeichen "" Java Basics - Anfänger-Themen 3
G Was macht dieses Program ? Java Basics - Anfänger-Themen 13
L Dieses Problem nagt an meiner Würde - Argument * Java Basics - Anfänger-Themen 4
D Vereinfachung dieses Programms Java Basics - Anfänger-Themen 11
megachucky Suche ein paar gute Tutorials so wie dieses hier. Java Basics - Anfänger-Themen 4
M Wie auf ein Objekt zugreifen und dieses manipulieren? Java Basics - Anfänger-Themen 5
S Hilfe!!!! Wie ändere ich dieses Applet???? Java Basics - Anfänger-Themen 9
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
wofus Interface EditText Feld Multiline Dezimalzahl Java Basics - Anfänger-Themen 2
HeiTim Brauche Hilfe soll ein nummeriertes Feld ausgeben lassen Java Basics - Anfänger-Themen 17
C Feld printen Java Basics - Anfänger-Themen 4
B Zu Property Feld weitere Informationen hinzufügen? Java Basics - Anfänger-Themen 4
J Button als Feld nutzen Java Basics - Anfänger-Themen 17
F Zahlen im Feld sortieren + Unterprogramm Java Basics - Anfänger-Themen 4
S Methoden Feld vergrößern Java Basics - Anfänger-Themen 1
M Interpreter-Fehler Feld NullPointerException Java Basics - Anfänger-Themen 4
neerual Feld mit Einsen und Nullen füllen und überschreiben Java Basics - Anfänger-Themen 1
O Schlange als dynamisches Feld - Aufwand Java Basics - Anfänger-Themen 16
L Feld mit beliebiger Anzahl von Buchstaben füllen... Java Basics - Anfänger-Themen 5
T Suchen in sortiertem Feld Java Basics - Anfänger-Themen 2
tuc Erste Schritte verschiedene objekte in einem feld speichern Java Basics - Anfänger-Themen 4
W Processing bestimmtes Feld einfärben Java Basics - Anfänger-Themen 8
T csv Datein einlesen und ausgewähltes Feld ausgeben Java Basics - Anfänger-Themen 4
E Feld von verketteten Listen Java Basics - Anfänger-Themen 11
N zweidimensionales 10x10 Feld erstellen Java Basics - Anfänger-Themen 3
M Feld in untermethoden ausgeben Java Basics - Anfänger-Themen 9
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
W 10x10 Feld mit Zufallszahlen erstellen Java Basics - Anfänger-Themen 4
M Wert aus String Feld anzeigen Java Basics - Anfänger-Themen 7
D Datentypen Zahlen aus einem alphanummerischen Feld in ein Interger Feld portieren Java Basics - Anfänger-Themen 13
L Daten aus Array Feld löschen Java Basics - Anfänger-Themen 2
D Datentypen Ein Integer Feld in einen String wandeln ohne Nullenunterdrückung Java Basics - Anfänger-Themen 6
V Feld sortieren mit Backtracking Java Basics - Anfänger-Themen 1
U Spielfelde erstellen & via Brute-Force jedes Feld aktivieren Java Basics - Anfänger-Themen 4
Z feld[zahl()-1] funktioniert nicht Java Basics - Anfänger-Themen 6
P Collections Feld aus Sets erstellen. Java Basics - Anfänger-Themen 7
E Methode, zwei Klassen, Feld Java Basics - Anfänger-Themen 9
T Ein Feld umdrehen Java Basics - Anfänger-Themen 5
T Erste Schritte Java ein Array Feld[index] zurueckgeben? Java Basics - Anfänger-Themen 20
Z Feld befüllen Java Basics - Anfänger-Themen 8
N Klasse/Konstruktor/Feld Java Basics - Anfänger-Themen 6
W Rückgabe Methode mit Feld Java Basics - Anfänger-Themen 4
B Frage zur Effizienz - alle Array-Felder initialisieren oder jedes Feld auf null prüfen? Java Basics - Anfänger-Themen 4
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
T Generisches Feld in nicht-generischer Klasse möglich? Java Basics - Anfänger-Themen 5
S Einzelne Werte von Array-Feld löschen Java Basics - Anfänger-Themen 15
D Mysql ob feld existiert Java Basics - Anfänger-Themen 2
N Input/Output 2D Feld ausgeben? Java Basics - Anfänger-Themen 3
R Bestehendes Array ein Feld hinzufügen Java Basics - Anfänger-Themen 4
M GUI JList - Objekte listen u. Feld anzeigen? Java Basics - Anfänger-Themen 16
M Applet ist nur graues Feld Java Basics - Anfänger-Themen 12
G Gleiche Elemente in Feld zählen Java Basics - Anfänger-Themen 13
G Elemente von Feld und Liste auf Gleichheit überprüfen Java Basics - Anfänger-Themen 13
R Nächstes leeres Feld im array füllen? Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben