it-swarm.com.de

Was sind die Unterschiede zwischen Klassenvariablen und Instanzvariablen in Java?

Ich bin sehr neu in Java und möchte den Unterschied zwischen Klassenvariablen und Instanzvariablen verstehen.

Zum Beispiel:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

Wie unterscheiden sich Instanzvariablen und Klassenvariablen voneinander? Welche Variablen sind hier Klassenvariablen und welche Instanzvariablen? Wie wirkt sich das auf den Umfang aus?

16
Skylar Adams

Sie sind beide Mitgliedsvariablen , was bedeutet, dass beide einer Klasse zugeordnet sind. Jetzt gibt es natürlich Unterschiede zwischen den beiden:

Instanzvariablen :

Diese Variablen gehören zur Instanz einer Klasse , also zu einem Objekt. Und jede Instanz dieser Klasse (Objekt) hat eine eigene Kopie dieser Variablen. An der Variablen vorgenommene Änderungen werden in anderen Instanzen dieser Klasse nicht berücksichtigt.

public class Product {
    public int Barcode;
}

Klassenvariablen :

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

public class Product {
    public static int Barcode;
}

Vollständiges Beispiel :

// INSTANCE VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.Barcode = 123456;

        Product prod2 = new Product();
        prod2.Barcode = 987654;

        System.out.println(prod1.Barcode);
        System.out.println(prod2.Barcode);
    }
}

public class Product {
    public int Barcode;
}

Die Ausgabe wird sein:

123456

987654

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

//CLASS VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {

    public static int Barcode;

    public int getBarcode() {
        return Barcode;
    }

    public void setBarcode(int value){
        Barcode = value;
    }
}

Ich habe nicht statische Methoden verwendet, um den Wert von Barcode abzurufen und festzulegen, damit er vom Objekt und nicht von der Klasse aufgerufen werden kann. Die Ausgabe wird wie folgt sein:

987654

987654

35
Abbas

Es wird erklärt hier (mit einem Beispiel Bicycle Klasse mit Klassenvariable numberOfBicycles und Instanzvariablen cadence, speed, gear & id):

Manchmal möchten Sie Variablen haben, die allen Objekten gemeinsam sind. Dies wird mit dem Modifikator static erreicht. Felder, deren Deklaration den Modifikator static enthält, werden als statische Felder oder Klassenvariablen bezeichnet. Sie sind eher der Klasse als einem Objekt zugeordnet. Jede Instanz der Klasse teilt eine Klassenvariable, die sich an einem festen Ort im Speicher befindet. Jedes Objekt kann den Wert einer Klassenvariablen ändern, aber Klassenvariablen können auch bearbeitet werden, ohne eine Instanz der Klasse zu erstellen.

Eine Klassenvariable (deklariert static) ist ein Speicherort, der allen Instanzen gemeinsam ist.

Im Beispiel ist numberOfBicycles eine Klassenvariable (da sie als static deklariert ist). Es gibt nur eine solche Variable (d. H. Den Ort), die allen Instanzen und der Klasse gemeinsam ist. Wenn Sie also numberOfBicycles in einer Methode ändern, wird bei anderen Methoden der neue Wert angezeigt (auch für andere Bicycle -Objekte).

Im Gegensatz dazu sind gear & id Instanzvariablen (da ihre Deklaration keinen Modifikator static enthält). . Jedes Bicycle Objekt hat ein eigenes. Wenn Sie gear für einige Bicycle a ändern und if b ist eine weitere Instanz, die a.gear hat keine Auswirkung auf b.gear

Jedes Java Objekt ist eine eigene Speicherzone mit einigen Metadaten (z. B. einem Verweis auf seine Klasse) und eigenen Instanzvariablen (möglicherweise von einer Oberklasse geerbt). Die Klassenvariablen sind jedoch den gemeinsam Klasse und von allen Instanzen geteilt.

Siehe auch Objekt (Informatik) & Instanzvariable Wikipages.

Instanzvariable :

  • Instanzvariablen werden in einer Klasse deklariert, jedoch außerhalb einer Methode, eines Konstruktors oder eines beliebigen Blocks.
  • Die Instanzvariable gehört zur Instanz einer Klasse, oder Sie können sagen, dass die Instanzvariable zum Objekt gehört.
  • Instanzvariablen haben für jede Instanz der Klasse einen eigenen Wert.

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }
    

Methode für den Zugriff auf die Instanzvariable :

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

Ausgabe : 2, Testen

Klassenvariable :

  • Die Klassenvariable gehört zur Klasse.
  • die Klassenvariable wird erstellt, indem vor der Variablen das Schlüsselwort "static" hinzugefügt wird.
  • Wird auch als statische Variable bezeichnet.
  • Die wichtigste Klassenvariable behält einen gemeinsamen Wert für alle Instanzen einer Klasse bei, auch wenn kein Instanzobjekt der Klasse vorhanden ist.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }
    

Methode für den Zugriff auf Klassenvariable :

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

Ausgabe: 2

Kurzer Unterschied zwischen Klassenvariable und Instanzvariable:

  • Instanzvariablen haben separate Werte für jede Instanz einer Klasse. Klassenvariablen behalten einen gemeinsamen Wert für alle Instanzen der Klasse bei, auch wenn kein Instanzobjekt dieser Klasse vorhanden ist.
  • Sie würden das statische Schlüsselwort verwenden, um eine Instanzvariable in eine Klassenvariable umzuwandeln.
  • Sowohl Instanz- als auch Klassenvariablen werden auf Klassenebene deklariert, nicht innerhalb von Methoden.
4
Garg's

Der Unterschied zwischen class variables und instance Variablen, ist einfach eine Frage von who knows what?.

Ein instance variable ist nur bekannt (= gebunden ) an diese konkret Instanz gebunden - daher der Name.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

Die Definition einer Klasse ist wie eine Blaupause zum Erstellen von Beton Objekten. Vielleicht ist dieser Punkt verwirrt Sie ein bisschen. Wenn Sie es jedoch so schreiben, wird jede Variable an ihr konkretes Objekt gebunden: z. Jede Person hat ihren eigenen Vornamen

EIN class variable hingegen ist - wie der Name schon sagt - jedem Mitglied einer Klasse bekannt; oder technisch: Es ist bekannt/gebunden auf Klassenebene. Das typische Beispiel ist ein Zähler für die Anzahl der Objekte, die Sie erstellt haben - obwohl es ein sehr problematisches Beispiel ist; Aber das spielt in diesem frühen Stadium keine Rolle.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersons wird als static deklariert. Dies ist das Schlüsselwort für die Unterscheidung zwischen class variables und instance variabes. Die Variable wird wie die anderen in der Klassendefinition deklariert. Das Schlüsselwort static signalisiert jedoch, dass es anders ist.

  • firstName, lastName sind Instanzvariablen und an diese konkrete Instanz gebunden

  • numberOfPersons ist an die Klasse gebunden, sodass jede Instanz auf diese Variable zugreifen kann.

tl; dr

Der Ort, an dem Variablen definiert werden, ist die Klassendefinition.

Klassenvariablen sind auf Klassenebene bekannt/gebunden, d. H. Jede konkrete Instanz hat Zugriff darauf. Um eine Klassenvariable zu definieren, verwenden Sie das Schlüsselwort static.

Instanzvariablen sind nur auf Instanzebene bekannt. Sie definieren sie ohne das Schlüsselwort static.

Weitere Dokumentation für Java ist hier

3
Thomas Junk