[JAVA] Unterschied zwischen Instanzvariable und Klassenvariable

1. Zuallererst

Der Unterschied zwischen Instanzvariablen und Klassenvariablen war nicht eindeutig, daher habe ich sie für die Zukunft zusammengefasst. Ich hoffe, es hilft.

2. Was ist eine Instanzvariable?

Es ist eine Variable, die zu jeder Instanz gehört. Insbesondere sichert das Schlüsselwort ** new ** den Bereich der Instanzvariablen (Instanz), und die Anfangswertzuweisung und der Konstruktor (Prozess, der beim Erstellen der Instanz ausgeführt wird) initialisieren die Instanzvariable. Beachten Sie, dass die erstellten Instanzen als separat erkannt werden, sodass der Wert der Instanzvariablen für jede Instanz unterschiedlich ist. Daher wird es verwendet, wenn Sie für jedes Objekt (Klasseninstanz) unterschiedliche Informationen verarbeiten möchten.

3. Was ist eine Klassenvariable?

Es ist eine Variable, die mit dem Schlüsselwort ** static deklariert ist ** und eine gemeinsame Information ist, die von allen Instanzen gemeinsam genutzt wird. Das Ändern des Werts einer Klassenvariablen von einem Objekt wirkt sich auf alle anderen Objekte aus. Daher wird es verwendet, wenn Sie Informationen verarbeiten möchten, die dem gesamten Objekt gemeinsam sind.

Postscript (2020/1/1) Aus dem Kommentar von @ shiracamus

Wenn zwischen Klassen eine Vererbungsbeziehung besteht, können Klassenvariablen für jede geerbte Klasse denselben Namen haben, und alle geerbten Klassen werden verfolgt und der zuerst erreichte Wert wird verwendet. Selbst wenn Klassenvariablen denselben Namen haben, können sich ihre Werte daher je nach referenzierender Klasse unterscheiden. (Fügen Sie hier ein konkretes Beispiel zu 5 hinzu.)

4. Jede Funktion

Instanzvariable Klassenvariable
Charakteristisch Für jedes erstellte Objekt wird ein Instanzvariablenbereich gesichert. Daher ist der Wert für jedes Objekt unterschiedlich. Für alle Objekte wird nur eine pro Klasse erstellte und gemeinsame Werte verwendet
Lebenszeit Ab dem Zeitpunkt, an dem ein Objekt erstellt wird, bis es verschwindet Vom Programmstart bis zum Ende
Wie rufe ich an? Variable, der das Objekt zugeordnet ist.Instanzvariable 1.Name der Klasse.Klassenvariable
2.Variable, der das Objekt zugeordnet ist.Instanzvariable
Erklärung Variablenname des Zugriffsmodifizierertyps Zugriffsmodifikatorstatisches SchlüsselwortGeben Sie den Variablennamen ein
Einflussbereich zum Zeitpunkt der Änderung Nur Objekte, die Instanzvariablen zugeordnet sind Alle Objekte

5. Spezifisches Beispiel

Instanzvariable

Main.java


public class Main {
  public static void main(String[] args) {
    Sample sampleA = new Sample();
    Sample sampleB = new Sample();
    
    sampleA.a = 10;
    sampleB.a = 20;
    System.out.println(sampleA.a);
    System.out.println(sampleB.a);
  }
}

public class Sample {

  public int a;
}

Ausgabeergebnis


10
20

Ich habe also unterschiedliche Werte für die Instanzvariablen jedes Objekts festgelegt Infolgedessen werden unterschiedliche Werte ausgegeben.

Klassenvariable

Main.java


public class Main {
  public static void main(String[] args) {
    Sample sampleA = new Sample();
    Sample sampleB = new Sample();

    sampleA.setNum(30);
    sampleB.setNum(40);
    System.out.println(sampleA.getNum());
    System.out.println(sampleB.getNum());
  }
}

public class Sample {
  
  public static int b;
  
  public void setNum(int value) {
    b = value;
  }

  public int getNum() {
    return b;
  }
}

Ausgabeergebnis


40
40

Klassenvariablen haben für alle Instanzen einen gemeinsamen Wert Weil Änderungen an einem Objekt andere Objekte betreffen Infolgedessen wird der letzte Satz "40" als Wert der Klassenvariablen ausgegeben.

Bonus

Main.java



public class Main {
  public static void main(String[] args) {
    var s1 = new Sample();
    var s2 = new Sample();
    System.out.println("Base: " + Base.a + ", " + Base.b);
    System.out.println("Sample: " + Sample.a + ", " + Sample.b);
    System.out.println("s1: " + s1.a + ", " + s1.b);
    System.out.println("s2: " + s2.a + ", " + s2.b);
    Base.a = 10;
    Sample.a = 20;
    s1.a = 30;
    s2.a = 40;
    System.out.println("Base: " + Base.a + ", " + Base.b);
    System.out.println("Sample: " + Sample.a + ", " + Sample.b);
    System.out.println("s1: " + s1.a + ", " + s1.b);
    System.out.println("s2: " + s2.a + ", " + s2.b);
    Base.b = 100;
    Sample.b = 999;
    System.out.println("Base: " + Base.a + ", " + Base.b);
    System.out.println("Sample: " + Sample.a + ", " + Sample.b);
    System.out.println("s1: " + s1.a + ", " + s1.b);
    System.out.println("s2: " + s2.a + ", " + s2.b);
  }
}

class Base {
    static int a = 0;
    static int b = 1;
}

class Sample extends Base {
    static int b = 2;
}

Ausgabeergebnis


Base: 0, 1
Sample: 0, 2
s1: 0, 2
s2: 0, 2
Base: 40, 1
Sample: 40, 2
s1: 40, 2
s2: 40, 2
Base: 40, 100
Sample: 40, 999
s1: 40, 999
s2: 40, 999

Referenzartikel

SOFTWARE ENGINEERING [tutorialspoint] (https://www.tutorialspoint.com/What-is-the-difference-between-class-variables-and-instance-variables-in-Java)

Recommended Posts

Unterschied zwischen Instanzvariable und Klassenvariable
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Ruby-Instanzvariable und lokaler Variable
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Schnittstelle und abstrakter Klasse
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Unterschied zwischen vh und%
Unterschied zwischen i ++ und ++ i
Der Unterschied zwischen der Ruby-Instanzmethode und der Klassenmethode ist leicht zu verstehen.
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
[Java] Unterschied zwischen == und gleich
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Bundle und Bundle-Installation
Beziehung zwischen Paket und Klasse
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Unterschied zwischen List und ArrayList
Unterschied zwischen .bashrc und .bash_profile
Unterschied zwischen StringBuilder und StringBuffer
Unterschied zwischen render und redirect_to
Unterschied zwischen Spring AOP und Bibliothekszielklasse
[Ruby] Unterschied zwischen get und post
Unterschied zwischen == Operator und Methode gleich
[Docker-compose] Unterschied zwischen env_file und Umgebung. Informationen zur Priorität der Anwendung von Umgebungsvariablen
[Java] Unterschied zwischen Hashmap und HashTable
[Terminal] Unterschied zwischen irb und pry
JavaServlet: Unterschied zwischen executeQuery und executeUpdate
[Ruby] Unterschied zwischen is_a? Und instance_of?
[Rails] Unterschied zwischen find und find_by
[JAVA] Unterschied zwischen Abstract und Interface
Unterschied zwischen Thymeleaf @RestController und @Controller
Unterschied zwischen Stream Map und FlatMap
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
[Java] Unterschied zwischen Array und ArrayList
Was ist der Unterschied zwischen einer Aktion und einer Instanzmethode?
Unterschied zwischen primitivem Typ und Referenztyp
Unterschied zwischen string.getByte () und Hex.decodeHex (string.toCharaArray ())
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
[Rails] Unterschied zwischen redirect_to und Rendern
[Android] Unterschied zwischen finish () und return;
[Ruby] Vielleicht verstehst du das nicht wirklich? [Unterschied zwischen Klasse und Modul]
[Ruby] Beziehung zwischen Elternklasse und Kinderklasse. Beziehung zwischen Klasse und Instanz.
[Java] Einführungsstruktur Klassendefinition Beziehung zwischen Klasse und Instanz Methodendefinitionsformat
Hinweis: Unterschied zwischen Ruby "p" und "Puts"
Unterschied zwischen final und Immutable in Java
[Hinweis] Unterschied zwischen Bundle-Installation und -Update
Unterschied zwischen pop () und peek () im Stapel