Was sind die Unterschiede zwischen Klassenvariablen und Instanzvariablen in Java? [geschlossen]

16

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

Beispielsweise:

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 dies auf den Geltungsbereich aus?

Skylar Adams
quelle
1
Sie haben anscheinend begonnen, die Java ™ -Anleitungen zu lesen : Grundlegendes zu Klassenmitgliedern, die dies erklären, aber noch nicht vollständig verstanden haben.

Antworten:

35

Sie sind beide Mitgliedsvariablen , was bedeutet, dass beide einer Klasse zugeordnet sind. Nun 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 Variablen werden auch als statische Membervariablen 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, werden alle anderen Instanzen die Auswirkungen der Änderungen sehen.

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 Barcodezu ermitteln und festzulegen, damit er vom Objekt und nicht von der Klasse aufgerufen werden kann. Die Ausgabe wird folgend sein:

987654

987654

Abbas
quelle
Warum ein C # -Beispiel für eine Java-Frage?
Basile Starynkevitch
Meine Gedanken genau. Ich kenne mich nur mit Java-Programmierung aus, nicht mit C #, also haben Sie nicht viel geholfen
Skylar Adams
1
@BasileStarynkevitch Ich bin hauptsächlich ein C # -Entwickler und da das Prinzip für beide gilt und so gut wie das gleiche ist, habe ich schnell ein C # -Beispiel bereitgestellt, natürlich falsch von mir. :) Mein Beispiel wurde in Java geändert.
Abbas
2
@SkylarAdams Sorry, ich habe fälschlicherweise zu schnell angenommen, dass jeder, der Java kennt, C # kennt. Ich habe das Beispiel in ein Java-Beispiel geändert, hoffe es hilft.
Abbas
9
Für diese Art von Frage halte ich es für irrelevant, ob mit Java oder C #
Thomas Junk
6

Es wird erklärt , hier (mit einer Beispiel - BicycleKlasse mit Klassenvariablen numberOfBicyclesund Instanzvariablen cadence, speed, gear& id):

Manchmal möchten Sie Variablen haben, die allen Objekten gemeinsam sind. Dies wird mit dem staticModifikator erreicht. Felder, staticderen Deklaration den Modifikator enthält, werden als statische Felder oder Klassenvariablen bezeichnet. Sie sind der Klasse und keinem Objekt zugeordnet. Jede Instanz der Klasse hat eine gemeinsame Klassenvariable, die sich an einer festen Stelle im Speicher befindet. Jedes Objekt kann den Wert einer Klassenvariablen ändern, Klassenvariablen können jedoch auch bearbeitet werden, ohne eine Instanz der Klasse zu erstellen.

Eine Klassenvariable (deklariert static ) ist eine Position, die allen Instanzen gemeinsam ist.

Im Beispiel numberOfBicycleshandelt es sich um eine Klassenvariable (da diese deklariert ist static). Es gibt nur eine solche Variable (dh Position), die allen Instanzen und der Klasse gemeinsam ist. Wenn Sie also numberOfBicyclesin einer Methode Änderungen vornehmen, sehen andere Methoden den neuen Wert (auch für andere)Bicycle Objekte).

Im Gegensatz gear& idist beispielsweise Variablen (weil ihre Erklärung hat keinen staticModifier). Jedes BicycleObjekt hat sein eigenes. Wenn Sie gearfür einige Bicycle a ändern und wenn b eine andere Instanz ist, hat die Änderung a.gearkeine Auswirkungen aufb.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 Superklasse geerbt). Die Klassenvariablen sind jedoch der Klasse gemeinsam und werden von allen Instanzen gemeinsam genutzt.

Siehe auch Objekt (Informatik) & Instanzvariable Wikipages.

Basile Starynkevitch
quelle
4

Instanzvariable:

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

    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 zum Zugriff auf Instanzvariable:

InstanceDemo demo = new InstanceDemo ();

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

Ausgang: 2, Prüfung

Klassenvariable:

  • Klassenvariable gehört zur Klasse.
  • Klassenvariable wird durch Hinzufügen des Schlüsselworts "static" vor der Variablen erstellt.
  • Wird auch als statische Variable bezeichnet.
  • Die wichtigste Klassenvariable verwaltet einen gemeinsamen Wert für alle Instanzen einer Klasse, 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 Klassenvariablen:

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

Ausgabe: 2

Kurzer Unterschied zwischen Klassenvariablen und Instanzvariablen:

  • 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 Schlüsselwort static verwenden, um eine Instanzvariable in eine Klassenvariable zu ändern.
  • Sowohl Instanz- als auch Klassenvariablen werden auf Klassenebene deklariert, nicht innerhalb von Methoden.
Gargs
quelle
3

Der Unterschied zwischen class variablesund instanceVariablen ist einfach eine Frage von who knows what?.

An instance variableist nur diese konkrete Instanz bekannt (= gebunden ) - daher der Name.

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

Die Definition einer Klasse ist wie eine Blaupause für die Erstellung konkreter Objekte. Vielleicht verwirrt Sie dieser Punkt ein bisschen. Wenn Sie es aber so schreiben, wird jede Variable an ihr konkretes Objekt gebunden: zB Jede Person hat ihren eigenen Vornamen

A class variablehingegen ist - wie der Name schon sagt - jedem Mitglied einer Klasse bekannt; oder technisch: Es ist auf Klassenebene bekannt / gebunden . Das typische Beispiel ist ein Zähler dafür, wie viele Objekte 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
  }

numberOfPersonswird deklariert, staticwelches das Schlüsselwort ist, um zwischen class variablesund zu unterscheiden instance variabes. Die Variable wird wie die anderen innerhalb der Klassendefinition deklariert. Aber das staticSchlüsselwort signalisiert, dass es anders ist.

  • firstName, lastNameSind Instanzvariablen und zu diesem konkreten Fall gebunden

  • numberOfPersons ist an die Klasse gebunden, so dass 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, dh 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 staticSchlüsselwort.

Weitere Dokumentation zu Java finden Sie hier

Thomas Junk
quelle