Statische vs Instanzvariablen: Differenz?

9

Was ist der Unterschied zwischen einer statischen und einer Instanzvariablen? Der folgende Satz ist was ich nicht bekommen kann:

  

In bestimmten Fällen sollte nur eine Kopie einer bestimmten Variablen von allen Objekten einer Klasse gemeinsam genutzt werden - hier wird eine statische Variable verwendet   Eine statische Variable stellt klassenweite Informationen dar. Alle Objekte einer Klasse teilen dieselben Daten.

Ich dachte, dass Instanz-Vars klassenweit verwendet wurden, während statische Variablen nur einen Bereich innerhalb ihrer eigenen Methoden hatten?

    
Mat 18.01.2014, 13:12
quelle

8 Antworten

11

Im Zusammenhang mit Klassenattributen hat static eine andere Bedeutung. Wenn Sie ein Feld wie:

haben %Vor%

Jede Instanz der Klasse teilt die dieselbe Variable. Wenn Sie sie also in einer Instanz ändern, wird die Änderung in allen Instanzen reflektiert. erstellt entweder vor oder nach der Änderung.

Sie könnten also verstehen, dass dies in vielen Fällen schlecht ist, weil es sich zu einem unerwünschten Nebeneffekt entwickeln kann: Das Ändern des Objekts a wirkt sich auch auf b aus und Sie fragen sich vielleicht warum b geändert wurde ohne ersichtlichen Grund. Jedenfalls gibt es Fälle, in denen dieses Verhalten absolut wünschenswert ist:

  1. -Klassenkonstanten: Da sie const sind, macht es keinen Schaden, wenn alle Klassen auf den gleichen Wert zugreifen, denn niemand kann das ändern. Sie können auch Speicher sparen, wenn Sie viele Instanzen dieser Klasse haben. Nicht sicher über gleichzeitig Zugriff.
  2. Variablen, die vorgesehen sind , die freigegeben werden sollen, z. B. Referenzzähler & amp; co.

static vars werden instanziiert, bevor das Programm gestartet wird. Wenn Sie also zu viele davon haben, können Sie den Startvorgang verlangsamen.

Eine static -Methode kann nur auf static -Attribute zugreifen, aber denke zweimal darüber nach, bevor du das versuchst.

Faustregel: Verwenden Sie nicht static , es sei denn, es ist notwendig und Sie wissen, was Sie tun, oder Sie eine Klassenkonstante deklarieren.

    
Stefano Sanfilippo 18.01.2014, 13:17
quelle
6

Sagen Sie, es gibt eine Testklasse:

%Vor%

Sie können auf eine statische Variable mit ihrem Klassennamen wie folgt zugreifen

%Vor%

In beiden Fällen wird die Ausgabe 1 sein, wie es von allen Instanzen der Testklasse geteilt wird. während die Instanzvariable jeweils eine separate Kopie von b hat (Instanzvariable) Also

%Vor%

Ich hoffe, das erklärt Ihre Anfrage.

    
user2754122 18.01.2014 13:23
quelle
3

Instanzvariablen :

Diese Variablen gehören zur Instanz einer Klasse, also eines Objekts. Und jede Instanz dieser Klasse (Objekt) hat eine eigene Kopie dieser Variablen. An der Variablen vorgenommene Änderungen spiegeln sich nicht in anderen Instanzen dieser Klasse wider.

%Vor%

Klassenvariablen :

Diese Variablen werden auch als statische Membervariablen bezeichnet. Es gibt nur eine Kopie dieser Variablen, die für alle Instanzen dieser Klasse freigegeben ist. Wenn Änderungen an dieser Variablen vorgenommen werden, werden alle anderen Instanzen die Auswirkungen der Änderungen sehen.

%Vor%

Vollständiges Beispiel:

Instanzvariablen :

%Vor%

Die Ausgabe ist:

  

123456
  987654

Ändern Sie nun die Instanzvariable in eine Klassenvariable, indem Sie sie statisch machen:

Klassenvariablen :

%Vor%

Ich habe nicht-statische Methoden verwendet, um den Wert von Barcode zu ermitteln und festzulegen, damit er vom Objekt und nicht von der Klasse aufgerufen werden kann.
Die Ausgabe wird folgen:

  

987654
  987654

    
Suchi Gupta 21.01.2017 03:33
quelle
2

Klassenvariablen haben nur eine Kopie, die von allen verschiedenen Objekten einer Klasse gemeinsam genutzt wird, während jedes Objekt eine eigene Kopie einer Instanzvariablen hat. So können Instanzvariablen über verschiedene Objekte hinweg unterschiedliche Werte haben, während Klassenvariablen über verschiedene Objekte hinweg nur einen Wert haben können.

    
jeswin 19.01.2016 09:58
quelle
1

Instanzvariablen enthalten Werte, auf die von mehr als einer Methode, einem Konstruktor oder Block oder wesentlichen Teilen des Zustands eines Objekts verwiesen werden muss, die in der Klasse vorhanden sein müssen. Die statische Variable wäre nur eine Kopie jeder Klassenvariablen pro Klasse, unabhängig davon, wie viele Objekte daraus erstellt werden.

    
Yel 08.04.2016 00:11
quelle
0

Ich denke, Sie denken über die C / C ++ - Definition des statischen Schlüsselworts nach. Dort hat das statische Schlüsselwort viele Verwendungsmöglichkeiten. In Java wird die Funktionalität des statischen Keywords in Ihrem Post beschrieben. Wie auch immer, du kannst es selbst ausprobieren:

%Vor%

und ähnlich für nicht statische Variablen:

%Vor%     
avak 18.01.2014 13:21
quelle
0

Statische (Klassen-) Variablen und Instanzvariablen sind beide Membervariablen, da sie beide einer bestimmten Klasse zugeordnet sind, aber der Unterschied zwischen ihnen besteht darin, dass Klassenvariablen nur eine Kopie haben, die von allen verschiedenen Objekten einer Klasse gemeinsam genutzt wird Jedes Objekt hat seine eigene Kopie einer Instanzvariablen. So können Instanzvariablen über verschiedene Objekte hinweg unterschiedliche Werte haben, während Klassenvariablen über verschiedene Objekte hinweg nur einen Wert haben können.

    
Venkat Bramhaiah 18.03.2016 06:14
quelle
0

Betrachten Sie eine Klasse MyClass mit einem statischen und einem nicht statischen Member:

%Vor%

Lassen Sie uns nun ein main() erstellen, um ein paar Instanzen zu erstellen:

%Vor%

Ergebnis:

%Vor%

Nun können Sie den Wert der statischen Variable 60 in beiden Zeitpunkten sehen, da sich sowohl obj1 als auch obj2 auf dieselbe Variable beziehen. Bei der nicht statischen Variable unterscheiden sich die Ausgaben, da jedes Objekt bei der Erstellung seine eigene Kopie der nicht statischen Variablen behält; Änderungen, die an ihnen vorgenommen werden, haben keinen Einfluss auf die andere Kopie der Variablen, die von einem anderen Objekt erstellt wurde.

    
user3729220 08.01.2018 19:09
quelle