private final static -> erstelle diese Variable nur einmal. private final -> Diese Variable für jedes Objekt erstellen. Zuerst spart man Speicher, machen Sie es.
user1923551
4
final staticbedeutet, dass diese Variable eine Konstante ist und nur der Klasse selbst zugeordnet ist, dh "eine konstante Variable pro Klasse", während final"eine konstante Variable pro Instanz" bedeutet. Infolgedessen können Sie keine final staticVariable in den Konstruktor der Klasse einfügen, da der Konstruktor eine neue Instanz enthält . (Sie können es selbst versuchen und erhalten eine Fehlermeldung)
LittleLittleQ
1
Mit "kann keine endgültige statische Variable in den Konstruktor der Klasse final static
einfügen
2
@ user1923551 Der Effekt wird für Dinge umgekehrt, die nur für eine begrenzte Zeit in großen Anwendungen, in Anwendungen mit wenig Speicher oder bei Verwendung eines Singletons benötigt werden. Wenn in jeder Klasse statisches Material vorhanden ist, wird ein (großer) Speicherplatz für nicht benötigtes Material reserviert. Es kann auch ein Speicherverlust sein, statische Endobjekte oder Sammlungen zu deklarieren.
Hoffentlich
Antworten:
309
Im Allgemeinen staticbedeutet "dem Typ selbst zugeordnet und nicht einer Instanz des Typs".
Das heißt, Sie können auf eine statische Variable verweisen, ohne jemals eine Instanz dieses Typs erstellt zu haben, und jeder Code, der auf die Variable verweist, verweist auf genau dieselben Daten. Vergleichen Sie dies mit einer Instanzvariablen: In diesem Fall gibt es eine unabhängige Version der Variablen pro Instanz der Klasse. Also zum Beispiel:
Test x =newTest();Test y =newTest();
x.instanceVariable =10;
y.instanceVariable =20;System.out.println(x.instanceVariable);
druckt 10 aus: y.instanceVariableund x.instanceVariablesind getrennt, weil xund ybeziehen sich auf verschiedene Objekte.
Sie können über Referenzen auf statische Mitglieder verweisen, obwohl dies eine schlechte Idee ist. Wenn wir das taten:
Test x =newTest();Test y =newTest();
x.staticVariable =10;
y.staticVariable =20;System.out.println(x.staticVariable);
dann würde das 20 ausdrucken - es gibt nur eine Variable, keine pro Instanz. Es wäre klarer gewesen, dies zu schreiben als:
Test x =newTest();Test y =newTest();Test.staticVariable =10;Test.staticVariable =20;System.out.println(Test.staticVariable);
Das macht das Verhalten viel offensichtlicher. Moderne IDEs schlagen normalerweise vor, die zweite Auflistung in die dritte zu ändern.
Es gibt keinen Grund für eine Inline-Deklaration, die den Wert wie folgt initialisiert, da jede Instanz ihren eigenen NUMBERWert hat, jedoch immer denselben Wert hat (unveränderlich und mit einem Literal initialisiert). Dies ist dasselbe, als nur eine final staticVariable für alle Instanzen zu haben.
privatefinalint NUMBER =10;
Wenn es sich nicht ändern kann, macht es keinen Sinn, eine Kopie pro Instanz zu haben.
Es ist jedoch sinnvoll, wenn es in einem Konstruktor wie diesem initialisiert wird:
// No initialization when is declaredprivatefinalint number;publicMyClass(int n){// The variable can be assigned in the constructor, but then// not modified later.
number = n;}
Jetzt MyClasskönnen wir für jede Instanz von einen anderen, aber unveränderlichen Wert von haben number.
Bis Enums in Java 5 verfügbar waren, war statisches Finale die übliche Art, Konstanten zu deklarieren.
Vineet Reynolds
22
@Vineet: Statische Finals sind immer noch die Möglichkeit, primitive Konstanten zu deklarieren, es sei denn, Sie haben eine aufgezählte Anzahl von ihnen =)
Chii
@ Matthew: Möglicherweise. Nicht für eine Konstante, sondern für einen logisch instanzbezogenen Wert. Nicht, dass ich Singletons sowieso sehr mag.
Jon Skeet
1
Eine radikale Frage. Lohnt es sich , mit private finalmehr als private static finalvon der Klasse, die wenig Speicher Squeeze - out / reclaim? Sagen wir für das calculatorGerät mit begrenztem RAM, aber viel CPU-Ressourcen.
Gewinnen Sie Myo Htet am
1
@ WinMyoHtet: Wenn Sie ein statisches Feld verwenden, gibt es insgesamt nur eines . Wenn Sie ein Instanzfeld verwenden, gibt es eines pro Instanz. Die Verwendung eines statischen Feldes ist besser, es sei denn, Sie haben keine Instanzen. In diesem Fall ist es sowieso nutzlos.
Jon Skeet
38
Zum Schluss können bei der Initialisierung zur Laufzeit unterschiedliche Werte zugewiesen werden. Beispielsweise
Somit hat jede Instanz einen anderen Wert von Feld a .
Für das statische Finale haben alle Instanzen denselben Wert und können nach der ersten Initialisierung nicht mehr geändert werden.
ClassTestStatic{publicstaticfinalint a;}TestStatic t1 =newTestStatic();
t1.a =10;TestStatic t2 =newTestStatic();
t1.a =20;// ERROR, CAN'T BE ALTERED AFTER THE FIRST INITIALIZATION.
Dies wird nicht kompiliert! Einer endgültigen Variablen muss entweder ein Wert zugewiesen oder ein Wert in ihren Konstruktoren zugewiesen werden. Diese Antwort wäre richtig, wenn 2 Konstruktoren angegeben würden, wobei jeder einem anderen Wert 'a' zuweist.
MattC
14
Bestätigen, dies wird nicht kompiliert. Wie oben angegeben, müssen die Variablen der endgültigen Instanz instanziiert werden, bevor der Konstruktor fertig ist, und die Variablen der letzten Klasse müssen instanziiert werden, bevor die Klasse erstellt wurde (Sie können einen statischen Block verwenden). Warum hat das so viele positive Stimmen bekommen?
Rudi Kershaw
Wie MattC betonte, können Sie nach dem Erstellen dieses Objekts keiner endgültigen Variablen zuweisen. Tatsächlich können Sie nicht einmal ein Objekt erstellen, ohne den endgültigen Variablen Werte zu geben ...
jamesdeath123
Für den Fall, dass jemand darüber stolpert, folgen Sie bitte der Antwort von MattC.
Faz
Dies ist, was ich denke, das OP gefragt hat, ich hatte vergessen, dass dem Finale bei der Instanziierung ein Wert zugewiesen werden kann, wenn er bei der Deklaration keinen angegeben hat.
Salsero69
34
Eine staticVariable bleibt während der gesamten Lebensdauer der Anwendung im Speicher und wird beim Laden der Klasse initialisiert. staticJedes Mal, wenn Sie ein newObjekt erstellen , wird eine Nichtvariable initialisiert . Es ist im Allgemeinen besser zu verwenden:
privatestaticfinalint NUMBER =10;
Warum? Dies reduziert den Speicherbedarf pro Instanz. Es ist möglicherweise auch günstig für Cache-Treffer. Und es macht einfach Sinn: staticsollte für Dinge verwendet werden, die von allen Instanzen (auch bekannt als Objekte) eines bestimmten Typs (auch bekannt als class) gemeinsam genutzt werden.
Zur Laufzeit wird auch eine statische Variable erstellt. Daher können Sie diese Variable oder Methode verwenden, bevor das Objekt erstellt wird.
Bobby
13
Gemäß der Java-Codierungskonvention sollte der Name einer statischen endgültigen Variablen in Großbuchstaben angegeben werden.
Starblue
@Martijn Courteaux, wie wäre es mit einer Situation, in der eine Klasse während der Lebensdauer der App einmal verwendet wird! private final intwird aus dem Speicher entfernt, wenn die Instanz GC'ed wird, während private static final intsie während der gesamten Lebensdauer dieser App im Speicher verbleibt. Was schlagen Sie im obigen Szenario vor?
MANN
@MANN: Das ist sehr theoretisch. Dafür gibt es buchstäblich kein nützliches Anwendungsszenario. Dies kann von Vorteil sein, wenn Sie 50000 int vars in einer Klasse haben. Selbst in diesem Fall würde dies 200 KB Speicherplatz sparen. Da es sich um Java handelt, scheint dies völlig irrelevant zu sein. Bei speicherkritischen Geräten würde ein anständiger C- oder C ++ - Compiler diese ganzzahligen Werte immer einbinden, sodass kein Speicher mehr vollständig freigegeben werden muss.
Martijn Courteaux
17
statisch bedeutet "der Klasse zugeordnet"; Ohne sie ist die Variable jeder Instanz der Klasse zugeordnet. Wenn es statisch ist, bedeutet dies, dass Sie nur eines im Speicher haben. Wenn nicht, haben Sie eine für jede von Ihnen erstellte Instanz. statisch bedeutet, dass die Variable so lange im Speicher bleibt, wie die Klasse geladen wird. Ohne sie kann die Variable gc'd werden, wenn ihre Instanz ist.
Instanzvariablen werden immer dann gc'd, wenn alle Verweise / Objekte darauf sterben, oder?
Ruchir Baronia
Instanzen sind gc'd, aber Statik ist Klassen zugeordnet, nicht Instanzen. Solange die Klasse im Speicher bleibt, können Sie auf ihre öffentlichen statischen Instanzen und Methoden verweisen. Diese gehen in die Dauerwelle (oder was auch immer das JDK 8-Äquivalent ist) und werden nicht gc'd.
Duffymo
Falsch. Wenn Sie einen Verweis auf eine Instanz im Speicher haben, können Sie auf die verfügbaren Methoden und Instanzen zugreifen. Der Rest ist falsch. Sie verstehen den Unterschied zwischen einer Klasse und ihren Instanzen nicht.
Duffymo
13
Als ich die Antworten las, fand ich keinen wirklichen Test, der wirklich auf den Punkt kam. Hier sind meine 2 Cent:
Wie ich dachte, macht Java einen Unterschied zwischen primitiven und anderen Typen. Primitive Typen in Java werden immer "zwischengespeichert", genau wie Zeichenfolgenliterale (keine neuen Zeichenfolgenobjekte), sodass kein Unterschied zwischen statischen und nicht statischen Elementen besteht.
Es gibt jedoch eine Speicherduplizierung für nicht statische Elemente, wenn sie keine Instanz eines primitiven Typs sind.
Das Ändern des Werts von valueStatic in 10 geht sogar noch weiter, da Java den beiden int-Variablen die gleichen Adressen gibt.
Das Autoboxing der 'int' -> Integer sorgt hier für Verwirrung. Sie sehen, dass das Autoboxen einiger (kleiner) int-Werte zu demselben Integer-Objekt führt.
dkneller
@StackHola @dkneller In der Tat ist Autoboxing ein sehr wichtiges Detail, das hier vorkommt. Die Unterschrift ist ObjectUtils.identityToString(Object). (Außerdem hat Java sowieso keine Referenzübergabe). Ein wirklich nützlicher Test wäre, zwei Objekte zuzuweisen und den Wert einer public final int FOO = 10Variablen mithilfe von Java-Reflexionen erzwungen zu ändern . Überprüfen Sie dann, ob das andere Objekt ebenfalls seinen Wert geändert hat.
Martijn Courteaux
11
Während die anderen Antworten ziemlich klar zu machen scheinen, dass es im Allgemeinen keinen Grund gibt, nicht statische Konstanten zu verwenden, konnte ich niemanden finden, der darauf hinweist, dass es möglich ist, verschiedene Instanzen mit unterschiedlichen Werten für ihre konstanten Variablen zu haben.
Betrachten Sie das folgende Beispiel:
publicclassTestClass{privatefinalstaticdouble NUMBER =Math.random();publicTestClass(){System.out.println(NUMBER);}}
Wenn Sie drei Instanzen von TestClass erstellen, wird derselbe Zufallswert dreimal gedruckt, da nur ein Wert generiert und in der statischen Konstante gespeichert wird.
Wenn Sie jedoch stattdessen das folgende Beispiel ausprobieren:
publicclassTestClass{privatefinaldouble NUMBER =Math.random();publicTestClass(){System.out.println(NUMBER);}}
Das Erstellen von drei Instanzen von TestClass würde jetzt drei verschiedene Zufallswerte drucken, da jede Instanz ihren eigenen zufällig generierten konstanten Wert hat.
Ich kann mir keine Situation vorstellen, in der es wirklich nützlich wäre, unterschiedliche konstante Werte für unterschiedliche Instanzen zu haben, aber ich hoffe, dies hilft darauf hinzuweisen, dass es einen deutlichen Unterschied zwischen statischen und nicht statischen Endspielen gibt.
Wie Jon bereits sagte, ist eine statische Variable, die auch als Klassenvariable bezeichnet wird, eine Variable, die über Instanzen einer Klasse hinweg existiert.
publicclassStaticVariable{staticint noOfInstances;StaticVariable(){
noOfInstances++;}publicstaticvoid main(String[] args){StaticVariable sv1 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);StaticVariable sv2 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);System.out.println("No. of instances for st2 : "+ sv2.noOfInstances);StaticVariable sv3 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);System.out.println("No. of instances for sv2 : "+ sv2.noOfInstances);System.out.println("No. of instances for sv3 : "+ sv3.noOfInstances);}}
Die Ausgabe des Programms ist unten angegeben:
Wie wir in diesem Beispiel sehen können, hat jedes Objekt eine eigene Kopie der Klassenvariablen.
C:\java>java StaticVariableNo. of instances for sv1 :1No. of instances for sv1 :2No. of instances for st2 :2No. of instances for sv1 :3No. of instances for sv2 :3No. of instances for sv3 :3
Nach den von mir durchgeführten Tests sind statische Endvariablen nicht mit endgültigen (nicht statischen) Variablen identisch! Endgültige (nicht statische) Variablen können von Objekt zu Objekt unterschiedlich sein !!! Dies ist jedoch nur möglich, wenn die Initialisierung im Konstruktor erfolgt! (Wenn es nicht vom Konstruktor initialisiert wird, ist es nur eine Verschwendung von Speicher, da für jedes erstellte Objekt endgültige Variablen erstellt werden, die nicht geändert werden können.)
Zum Beispiel:
class A
{finalint f;staticfinalint sf =5;
A(int num){this.f = num;}void show(){System.out.printf("About Object: %s\n Final: %d\n Static Final: %d\n\n",this.toString(),this.f, sf);}publicstaticvoid main(String[] args){
A ob1 =new A(14);
ob1.show();
A ob2 =new A(21);
ob2.show();}}
Was auf dem Bildschirm angezeigt wird, ist:
Über das Objekt: A @ addbf1 Finale: 14 Statisches Finale: 5
Über das Objekt: A @ 530daa Finale: 21 Statisches Finale: 5
Wenn Sie das statische Finale verwenden, verhält sich Jon zu einer Art "Definition". Sobald Sie die Klasse kompiliert haben, die sie verwendet, wird sie in der kompilierten .class-Datei gebrannt. Überprüfen Sie meinen Thread darüber hier .
Für Ihr Hauptziel: Wenn Sie die NUMMER in den verschiedenen Instanzen der Klasse nicht unterschiedlich verwenden, würde ich empfehlen, final und static zu verwenden.
(Sie müssen nur bedenken, keine kompilierten Klassendateien zu kopieren, ohne mögliche Probleme zu berücksichtigen, wie sie in meiner Fallstudie beschrieben werden. In den meisten Fällen tritt dies nicht auf, keine Sorge :))
Überprüfen Sie diesen Code, um zu zeigen, wie Sie verschiedene Werte in Instanzen verwenden:
package test;publicclassTest{finallong OBJECT_ID =newRandom().nextLong();finalstaticlong CLASSS_ID =newRandom().nextLong();publicstaticvoid main(String[] args){Test[] test =newTest[5];for(int i =0; i < test.length; i++){
test[i]=newTest();System.out.println("Class id: "+test[i].CLASSS_ID);//<- Always the same valueSystem.out.println("Object id: "+test[i].OBJECT_ID);//<- Always different}}}
Der Schlüssel ist, dass Variablen und Funktionen unterschiedliche Werte zurückgeben können. Daher können endgültige Variablen mit unterschiedlichen Werten zugewiesen werden.
Könnten Sie bitte näher erläutern, was besser ist und warum?
Daniel
2
Nur ein weiteres einfaches Beispiel, um die Verwendung statischer, statischer endgültiger und endgültiger Variablen zu verstehen. Codekommentare haben die richtige Erklärung.
publicclassCity{// base price that is always same for all objects[For all cities].privatestaticdouble iphone_base_price =10000;// this is total price = iphone_base_price+iphone_diff;privatedouble iphone_citi_price;// extra price added to iphone_base_price. It is constant per city. Every// city has its own difference defined,privatefinaldouble iphone_diff;privateString cityName ="";// static final will be accessible everywhere within the class but cant be// changed once initialized.privatestaticfinalString countryName ="India";publicCity(String cityName,double iphone_diff){super();this.iphone_diff = iphone_diff;
iphone_citi_price = iphone_base_price + iphone_diff;this.cityName = cityName;}/**
* get phone price
*
* @return
*/privatedouble getPrice(){return iphone_citi_price;}/**
* Get city name
*
* @return
*/privateString getCityName(){return cityName;}publicstaticvoid main(String[] args){// 300 is theCity newyork =newCity("Newyork",300);System.out.println(newyork.getPrice()+" "+ newyork.getCityName());City california =newCity("California",800);System.out.println(california.getPrice()+" "+ california.getCityName());// We cant write below statement as a final variable can not be// reassigned// california.iphone_diff=1000; //************************// base price is defined for a class and not per instances.// For any number of object creation, static variable's value would be the same// for all instances until and unless changed.// Also it is accessible anywhere inside a class.
iphone_base_price =9000;City delhi =newCity("delhi",400);System.out.println(delhi.getPrice()+" "+ delhi.getCityName());City moscow =newCity("delhi",500);System.out.println(moscow.getPrice()+" "+ moscow.getCityName());// Here countryName is accessible as it is static but we can not change it as it is final as well. //Something are meant to be accessible with no permission to modify it. //Try un-commenting below statementsSystem.out.println(countryName);// countryName="INDIA";// System.out.println(countryName);}}
Es gibt keinen großen Unterschied, da beide Konstanten sind. Für die meisten Klassendatenobjekte würde statisch etwas bedeuten, das der Klasse selbst zugeordnet ist, da nur eine Kopie vorhanden ist, unabhängig davon, wie viele Objekte mit new erstellt wurden.
Da es sich um eine Konstante handelt, wird sie möglicherweise weder in der Klasse noch in einer Instanz gespeichert, aber der Compiler lässt Sie dennoch nicht über eine statische Methode auf Instanzobjekte zugreifen, selbst wenn er weiß, um welche es sich handelt. Das Vorhandensein der Reflection-API erfordert möglicherweise auch sinnlose Arbeit, wenn Sie sie nicht statisch machen.
Da eine Variable in einer Klasse im selben Befehl als endgültig UND initialisiert deklariert wird, gibt es absolut keinen Grund, sie nicht als statisch zu deklarieren, da sie unabhängig von der Instanz denselben Wert hat. Somit können alle Instanzen dieselbe Speicheradresse für einen Wert gemeinsam nutzen, wodurch Verarbeitungszeit gespart wird, da keine neue Variable für jede Instanz erstellt werden muss, und Speicherplatz gespart wird, indem eine gemeinsame Adresse gemeinsam genutzt wird.
private static final wird als Konstante betrachtet und auf die Konstante kann nur innerhalb dieser Klasse zugegriffen werden. Da das Schlüsselwort static enthalten ist, ist der Wert für alle Objekte der Klasse konstant.
Der private endgültige Variablenwert entspricht der Konstanten pro Objekt.
Sie können auf java.lang.String verweisen oder nach dem folgenden Beispiel suchen.
Das statische Mitglied ist in allen Klasseninstanzen und in der Klasse selbst dasselbe Mitglied.
Das Nicht-Statische ist eines für jede Instanz (Objekt). In Ihrem genauen Fall ist es also eine Verschwendung von Speicher, wenn Sie kein Statisches setzen.
Wenn Sie diese Variable als statisch markieren, benötigen Sie, wie Sie wissen, statische Methoden, um erneut auf diese Werte zuzugreifen. Dies ist hilfreich, wenn Sie bereits daran denken, diese Variablen nur in statischen Methoden zu verwenden. Wenn dies so ist, wäre dies der beste.
Sie können die Variable jetzt jedoch als öffentlich festlegen, da niemand sie wie "System.out" ändern kann. Dies hängt wiederum von Ihren Absichten und dem ab, was Sie erreichen möchten.
Für den Zugriff auf statische Variablen wären keine statischen Methoden erforderlich. Ich denke, Sie möchten "über statische Methoden auf Instanzvariablen zugreifen" (nicht zulässig).
Ataulm
0
Nehmen wir an, wenn die Klasse nie mehr als eine Instanz hat, welche benötigt dann mehr Speicher:
private static final int ID = 250; oder private final int ID = 250;
Ich habe verstanden, dass sich statisch auf den Klassentyp mit nur einer Kopie im Speicher bezieht und nicht statisch sich für jede Instanzvariable an einem neuen Speicherort befindet. Wenn wir jedoch intern nur eine Instanz derselben Klasse jemals vergleichen (dh es würde nicht mehr als eine Instanz erstellt werden), gibt es dann einen Overhead in Bezug auf den von einer statischen Endvariablen verwendeten Speicherplatz?
Bitte wiederholen Sie nicht nur, welche anderen Antworten bereits behandelt wurden.
Benutzer unbekannt
0
Die statische Variable gehört zur Klasse (dh alle Objekte teilen sich diese Variable). Zu jedem Objekt gehört eine nicht statische Variable.
publicclassExperimentFinal{privatefinalint a;privatestaticfinalint b =999;publicExperimentFinal(int a){super();this.a = a;}publicint getA(){return a;}publicint getB(){return b;}publicvoid print(int a,int b){System.out.println("final int: "+ a +" \nstatic final int: "+ b);}publicstaticvoid main(String[] args){ExperimentFinal test =newExperimentFinal(9);
test.print(test.getA(), test.getB());}}
Wie Sie im obigen Beispiel sehen können, können wir für "final int" unsere Variable für jede Instanz (Objekt) der Klasse zuweisen. Für "static final int" sollten wir jedoch eine Variable in der Klasse zuweisen (statische Variable gehört zur Klasse ).
Final: Sobald eine endgültige Variable zugewiesen wurde, enthält sie immer denselben Wert. Überall dort, wo die Variable statisch oder nicht statisch ist: Es handelt sich nur um eine Variable für alle Instanzen, die einmal im Speicher initialisiert wurden
publicclassLengthDemo{publicstaticvoid main(String[] args){Rectangle box =newRectangle();System.out.println("Sending the value 10.0 "+"to the setLength method.");
box.setLength(10.0);System.out.println("Done.");}}
Das Schlüsselwort "Static" macht die Variableigenschaft der Klasse und nicht einzelne Instanzen der Klasse. Es wird eine Kopie dieser Variablen geben, die von allen Instanzen dieser Klasse gemeinsam genutzt wird. Jede Änderung des Status der statischen Variablen wird in allen Instanzen berücksichtigt. Wenn Sie final zu static hinzufügen, erhalten Sie eine Variable, die zum Zeitpunkt des Ladens der Klasse ein für alle Mal initialisiert wurde und später von keiner Instanz der Klasse geändert werden kann. Statische endgültige Variablen müssen zum Deklarationszeitpunkt initialisiert werden, da sonst ein Fehler bei der Kompilierung auftritt. Das Feld für private Instanzen bezieht sich auf die Eigenschaft / den Status eines Objekts / einer Instanz einer Klasse. Jede Instanz / jedes Objekt der Klasse verfügt über eine eigene Kopie der Instanzvariablen. Wenn die Instanzvariable als endgültig deklariert wird, Dies bedeutet, dass wir den Wert für diese Instanz nicht ändern können. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich.
final static
bedeutet, dass diese Variable eine Konstante ist und nur der Klasse selbst zugeordnet ist, dh "eine konstante Variable pro Klasse", währendfinal
"eine konstante Variable pro Instanz" bedeutet. Infolgedessen können Sie keinefinal static
Variable in den Konstruktor der Klasse einfügen, da der Konstruktor eine neue Instanz enthält . (Sie können es selbst versuchen und erhalten eine Fehlermeldung)final static
Antworten:
Im Allgemeinen
static
bedeutet "dem Typ selbst zugeordnet und nicht einer Instanz des Typs".Das heißt, Sie können auf eine statische Variable verweisen, ohne jemals eine Instanz dieses Typs erstellt zu haben, und jeder Code, der auf die Variable verweist, verweist auf genau dieselben Daten. Vergleichen Sie dies mit einer Instanzvariablen: In diesem Fall gibt es eine unabhängige Version der Variablen pro Instanz der Klasse. Also zum Beispiel:
druckt 10 aus:
y.instanceVariable
undx.instanceVariable
sind getrennt, weilx
undy
beziehen sich auf verschiedene Objekte.Sie können über Referenzen auf statische Mitglieder verweisen, obwohl dies eine schlechte Idee ist. Wenn wir das taten:
dann würde das 20 ausdrucken - es gibt nur eine Variable, keine pro Instanz. Es wäre klarer gewesen, dies zu schreiben als:
Das macht das Verhalten viel offensichtlicher. Moderne IDEs schlagen normalerweise vor, die zweite Auflistung in die dritte zu ändern.
Es gibt keinen Grund für eine Inline-Deklaration, die den Wert wie folgt initialisiert, da jede Instanz ihren eigenen
NUMBER
Wert hat, jedoch immer denselben Wert hat (unveränderlich und mit einem Literal initialisiert). Dies ist dasselbe, als nur einefinal static
Variable für alle Instanzen zu haben.Wenn es sich nicht ändern kann, macht es keinen Sinn, eine Kopie pro Instanz zu haben.
Es ist jedoch sinnvoll, wenn es in einem Konstruktor wie diesem initialisiert wird:
Jetzt
MyClass
können wir für jede Instanz von einen anderen, aber unveränderlichen Wert von habennumber
.quelle
private final
mehr alsprivate static final
von der Klasse, die wenig Speicher Squeeze - out / reclaim? Sagen wir für dascalculator
Gerät mit begrenztem RAM, aber viel CPU-Ressourcen.Zum Schluss können bei der Initialisierung zur Laufzeit unterschiedliche Werte zugewiesen werden. Beispielsweise
Somit hat jede Instanz einen anderen Wert von Feld a .
Für das statische Finale haben alle Instanzen denselben Wert und können nach der ersten Initialisierung nicht mehr geändert werden.
quelle
Eine
static
Variable bleibt während der gesamten Lebensdauer der Anwendung im Speicher und wird beim Laden der Klasse initialisiert.static
Jedes Mal, wenn Sie einnew
Objekt erstellen , wird eine Nichtvariable initialisiert . Es ist im Allgemeinen besser zu verwenden:Warum? Dies reduziert den Speicherbedarf pro Instanz. Es ist möglicherweise auch günstig für Cache-Treffer. Und es macht einfach Sinn:
static
sollte für Dinge verwendet werden, die von allen Instanzen (auch bekannt als Objekte) eines bestimmten Typs (auch bekannt alsclass
) gemeinsam genutzt werden.quelle
private final int
wird aus dem Speicher entfernt, wenn die Instanz GC'ed wird, währendprivate static final int
sie während der gesamten Lebensdauer dieser App im Speicher verbleibt. Was schlagen Sie im obigen Szenario vor?statisch bedeutet "der Klasse zugeordnet"; Ohne sie ist die Variable jeder Instanz der Klasse zugeordnet. Wenn es statisch ist, bedeutet dies, dass Sie nur eines im Speicher haben. Wenn nicht, haben Sie eine für jede von Ihnen erstellte Instanz. statisch bedeutet, dass die Variable so lange im Speicher bleibt, wie die Klasse geladen wird. Ohne sie kann die Variable gc'd werden, wenn ihre Instanz ist.
quelle
Als ich die Antworten las, fand ich keinen wirklichen Test, der wirklich auf den Punkt kam. Hier sind meine 2 Cent:
Ergebnisse für das erste Objekt:
Ergebnisse für 2. Objekt:
Fazit :
Wie ich dachte, macht Java einen Unterschied zwischen primitiven und anderen Typen. Primitive Typen in Java werden immer "zwischengespeichert", genau wie Zeichenfolgenliterale (keine neuen Zeichenfolgenobjekte), sodass kein Unterschied zwischen statischen und nicht statischen Elementen besteht.
Es gibt jedoch eine Speicherduplizierung für nicht statische Elemente, wenn sie keine Instanz eines primitiven Typs sind.
Das Ändern des Werts von valueStatic in 10 geht sogar noch weiter, da Java den beiden int-Variablen die gleichen Adressen gibt.
quelle
ObjectUtils.identityToString(Object)
. (Außerdem hat Java sowieso keine Referenzübergabe). Ein wirklich nützlicher Test wäre, zwei Objekte zuzuweisen und den Wert einerpublic final int FOO = 10
Variablen mithilfe von Java-Reflexionen erzwungen zu ändern . Überprüfen Sie dann, ob das andere Objekt ebenfalls seinen Wert geändert hat.Während die anderen Antworten ziemlich klar zu machen scheinen, dass es im Allgemeinen keinen Grund gibt, nicht statische Konstanten zu verwenden, konnte ich niemanden finden, der darauf hinweist, dass es möglich ist, verschiedene Instanzen mit unterschiedlichen Werten für ihre konstanten Variablen zu haben.
Betrachten Sie das folgende Beispiel:
Wenn Sie drei Instanzen von TestClass erstellen, wird derselbe Zufallswert dreimal gedruckt, da nur ein Wert generiert und in der statischen Konstante gespeichert wird.
Wenn Sie jedoch stattdessen das folgende Beispiel ausprobieren:
Das Erstellen von drei Instanzen von TestClass würde jetzt drei verschiedene Zufallswerte drucken, da jede Instanz ihren eigenen zufällig generierten konstanten Wert hat.
Ich kann mir keine Situation vorstellen, in der es wirklich nützlich wäre, unterschiedliche konstante Werte für unterschiedliche Instanzen zu haben, aber ich hoffe, dies hilft darauf hinzuweisen, dass es einen deutlichen Unterschied zwischen statischen und nicht statischen Endspielen gibt.
quelle
Wie Jon bereits sagte, ist eine statische Variable, die auch als Klassenvariable bezeichnet wird, eine Variable, die über Instanzen einer Klasse hinweg existiert.
Ich habe hier ein Beispiel dafür gefunden :
Die Ausgabe des Programms ist unten angegeben:
Wie wir in diesem Beispiel sehen können, hat jedes Objekt eine eigene Kopie der Klassenvariablen.
quelle
Nach den von mir durchgeführten Tests sind statische Endvariablen nicht mit endgültigen (nicht statischen) Variablen identisch! Endgültige (nicht statische) Variablen können von Objekt zu Objekt unterschiedlich sein !!! Dies ist jedoch nur möglich, wenn die Initialisierung im Konstruktor erfolgt! (Wenn es nicht vom Konstruktor initialisiert wird, ist es nur eine Verschwendung von Speicher, da für jedes erstellte Objekt endgültige Variablen erstellt werden, die nicht geändert werden können.)
Zum Beispiel:
Was auf dem Bildschirm angezeigt wird, ist:
Über das Objekt: A @ addbf1 Finale: 14 Statisches Finale: 5
Über das Objekt: A @ 530daa Finale: 21 Statisches Finale: 5
Anonymer IT-Student im ersten Jahr, Griechenland
quelle
Wenn Sie das statische Finale verwenden, verhält sich Jon zu einer Art "Definition". Sobald Sie die Klasse kompiliert haben, die sie verwendet, wird sie in der kompilierten .class-Datei gebrannt. Überprüfen Sie meinen Thread darüber hier .
Für Ihr Hauptziel: Wenn Sie die NUMMER in den verschiedenen Instanzen der Klasse nicht unterschiedlich verwenden, würde ich empfehlen, final und static zu verwenden. (Sie müssen nur bedenken, keine kompilierten Klassendateien zu kopieren, ohne mögliche Probleme zu berücksichtigen, wie sie in meiner Fallstudie beschrieben werden. In den meisten Fällen tritt dies nicht auf, keine Sorge :))
Überprüfen Sie diesen Code, um zu zeigen, wie Sie verschiedene Werte in Instanzen verwenden:
quelle
Hier sind meine zwei Cent:
Beispiel:
Der Schlüssel ist, dass Variablen und Funktionen unterschiedliche Werte zurückgeben können. Daher können endgültige Variablen mit unterschiedlichen Werten zugewiesen werden.
quelle
Nur ein weiteres einfaches Beispiel, um die Verwendung statischer, statischer endgültiger und endgültiger Variablen zu verstehen. Codekommentare haben die richtige Erklärung.
quelle
sehr wenig und statisch
Es gibt keinen großen Unterschied, da beide Konstanten sind. Für die meisten Klassendatenobjekte würde statisch etwas bedeuten, das der Klasse selbst zugeordnet ist, da nur eine Kopie vorhanden ist, unabhängig davon, wie viele Objekte mit new erstellt wurden.
Da es sich um eine Konstante handelt, wird sie möglicherweise weder in der Klasse noch in einer Instanz gespeichert, aber der Compiler lässt Sie dennoch nicht über eine statische Methode auf Instanzobjekte zugreifen, selbst wenn er weiß, um welche es sich handelt. Das Vorhandensein der Reflection-API erfordert möglicherweise auch sinnlose Arbeit, wenn Sie sie nicht statisch machen.
quelle
Da eine Variable in einer Klasse im selben Befehl als endgültig UND initialisiert deklariert wird, gibt es absolut keinen Grund, sie nicht als statisch zu deklarieren, da sie unabhängig von der Instanz denselben Wert hat. Somit können alle Instanzen dieselbe Speicheradresse für einen Wert gemeinsam nutzen, wodurch Verarbeitungszeit gespart wird, da keine neue Variable für jede Instanz erstellt werden muss, und Speicherplatz gespart wird, indem eine gemeinsame Adresse gemeinsam genutzt wird.
quelle
private static final wird als Konstante betrachtet und auf die Konstante kann nur innerhalb dieser Klasse zugegriffen werden. Da das Schlüsselwort static enthalten ist, ist der Wert für alle Objekte der Klasse konstant.
Der private endgültige Variablenwert entspricht der Konstanten pro Objekt.
Sie können auf java.lang.String verweisen oder nach dem folgenden Beispiel suchen.
//Ausgabe:
quelle
Das statische Mitglied ist in allen Klasseninstanzen und in der Klasse selbst dasselbe Mitglied.
Das Nicht-Statische ist eines für jede Instanz (Objekt). In Ihrem genauen Fall ist es also eine Verschwendung von Speicher, wenn Sie kein Statisches setzen.
quelle
Wenn Sie diese Variable als statisch markieren, benötigen Sie, wie Sie wissen, statische Methoden, um erneut auf diese Werte zuzugreifen. Dies ist hilfreich, wenn Sie bereits daran denken, diese Variablen nur in statischen Methoden zu verwenden. Wenn dies so ist, wäre dies der beste.
Sie können die Variable jetzt jedoch als öffentlich festlegen, da niemand sie wie "System.out" ändern kann. Dies hängt wiederum von Ihren Absichten und dem ab, was Sie erreichen möchten.
quelle
Nehmen wir an, wenn die Klasse nie mehr als eine Instanz hat, welche benötigt dann mehr Speicher:
private static final int ID = 250; oder private final int ID = 250;
Ich habe verstanden, dass sich statisch auf den Klassentyp mit nur einer Kopie im Speicher bezieht und nicht statisch sich für jede Instanzvariable an einem neuen Speicherort befindet. Wenn wir jedoch intern nur eine Instanz derselben Klasse jemals vergleichen (dh es würde nicht mehr als eine Instanz erstellt werden), gibt es dann einen Overhead in Bezug auf den von einer statischen Endvariablen verwendeten Speicherplatz?
quelle
Die statische Variable gehört zur Klasse (dh alle Objekte teilen sich diese Variable). Zu jedem Objekt gehört eine nicht statische Variable.
Wie Sie im obigen Beispiel sehen können, können wir für "final int" unsere Variable für jede Instanz (Objekt) der Klasse zuweisen. Für "static final int" sollten wir jedoch eine Variable in der Klasse zuweisen (statische Variable gehört zur Klasse ).
quelle
Wenn Sie static verwenden, ist der Wert der Variablen in allen Instanzen gleich. Wenn er in einer Instanz geändert wird, ändern sich auch die anderen.
quelle
Final: Sobald eine endgültige Variable zugewiesen wurde, enthält sie immer denselben Wert. Überall dort, wo die Variable statisch oder nicht statisch ist: Es handelt sich nur um eine Variable für alle Instanzen, die einmal im Speicher initialisiert wurden
quelle
Dies könnte helfen
quelle
Das Schlüsselwort "Static" macht die Variableigenschaft der Klasse und nicht einzelne Instanzen der Klasse. Es wird eine Kopie dieser Variablen geben, die von allen Instanzen dieser Klasse gemeinsam genutzt wird. Jede Änderung des Status der statischen Variablen wird in allen Instanzen berücksichtigt. Wenn Sie final zu static hinzufügen, erhalten Sie eine Variable, die zum Zeitpunkt des Ladens der Klasse ein für alle Mal initialisiert wurde und später von keiner Instanz der Klasse geändert werden kann. Statische endgültige Variablen müssen zum Deklarationszeitpunkt initialisiert werden, da sonst ein Fehler bei der Kompilierung auftritt. Das Feld für private Instanzen bezieht sich auf die Eigenschaft / den Status eines Objekts / einer Instanz einer Klasse. Jede Instanz / jedes Objekt der Klasse verfügt über eine eigene Kopie der Instanzvariablen. Wenn die Instanzvariable als endgültig deklariert wird, Dies bedeutet, dass wir den Wert für diese Instanz nicht ändern können. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Dazu müssen wir die endgültige Variable entweder bei der Deklaration oder im Konstruktor initialisieren. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Wenn dies in keinem von beiden der Fall ist, wird ein Fehler bei der Kompilierung angezeigt. Wenn Sie nach der Initialisierung versuchen, einen Wert neu zuzuweisen, wird ein Fehler bei der Kompilierung angezeigt. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Verwenden Sie statische Endvariablen, bei denen die Daten für alle Instanzen der Klasse gemeinsam genutzt werden und die Daten schreibgeschützt sein sollen. Verwenden Sie die Endvariable der Instanz, wenn Sie einige Daten darstellen möchten, die zu jeder einzelnen Instanz der Klasse gehören, jedoch nur einmal gespeichert kann nicht geändert werden. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich. Die Verwendung von statischen und Instanzschlüsselwörtern hängt von Ihren Entwurfsanforderungen und der Darstellung dieser Daten in der Domäne ab. Wenn die Daten für alle Klasseninstanzen verwendet werden, sind keine einzelnen Kopien / Speicherreferenzen für jedes Objekt erforderlich.
quelle