Quali sono le differenze tra variabili di classe e variabili di istanza in Java? [chiuso]


16

Sono molto nuovo in Java e voglio capire la differenza tra variabili di classe e variabili di istanza.

Per esempio:

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

In che modo le variabili di istanza e le variabili di classe sono diverse l'una dall'altra? Quali variabili qui sono variabili di classe e quali sono variabili di istanza? In che modo ciò influisce sull'ambito?


1
Sembra che tu abbia iniziato a leggere The Java ™ Tutorials: Capire i membri della classe che lo spiegano, ma non l'ho compreso appieno.

Risposte:


35

Entrambi sono variabili membro , nel senso che entrambi sono associati a una classe. Ora, naturalmente, ci sono differenze tra i due:

Variabili di istanza:

Queste variabili appartengono all'istanza di una classe , quindi un oggetto. E ogni istanza di quella classe (oggetto) ha la propria copia di quella variabile. Le modifiche apportate alla variabile non si riflettono in altre istanze di quella classe.

public class Product {
    public int Barcode;
}

Variabili di classe:

Queste sono anche conosciute come variabili membro statiche e c'è solo una copia di quella variabile condivisa con tutte le istanze di quella classe. Se vengono apportate modifiche a quella variabile, tutte le altre istanze vedranno l'effetto delle modifiche.

public class Product {
    public static int Barcode;
}

Esempio completo:

// 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;
}

L'output sarà:

123456

987654

Ora, cambia la variabile di istanza in una variabile di classe rendendola statica:

//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;
    }
}

Ho usato metodi non statici per ottenere e impostare il valore di Barcodeessere in grado di chiamarlo dall'oggetto e non dalla classe. L'output sarà il seguente:

987654

987654


Perché un esempio C # per una domanda Java?
Basile Starynkevitch,

I miei pensieri esattamente. Conosco solo la programmazione Java non C #, quindi non sei stato di grande aiuto
Skylar Adams,

1
@BasileStarynkevitch Sono principalmente uno sviluppatore di C # e poiché il principio conta per entrambi ed è buono come lo stesso ho fornito rapidamente un esempio di C #, ovviamente sbagliato a me. :) Ho cambiato il mio esempio in Java.
Abbas,

2
@SkylarAdams Siamo spiacenti, ho erroneamente assunto troppo rapidamente che chiunque conosca Java, conosce C #. Ho cambiato l'esempio con uno Java, spero che sia d'aiuto.
Abbas,

9
Per questo tipo di domanda, penso che sia irrilevante, sia che si usi Java o C #,
Thomas Junk

6

Viene spiegato qui (con un esempio Bicycleclasse con variabili classe numberOfBicyclesvariabili e istanza cadence, speed, gear& id):

A volte, si desidera avere variabili comuni a tutti gli oggetti. Questo si ottiene con il staticmodificatore. I campi che hanno il staticmodificatore nella loro dichiarazione sono chiamati campi statici o variabili di classe. Sono associati alla classe, piuttosto che a qualsiasi oggetto. Ogni istanza della classe condivide una variabile di classe, che si trova in una posizione fissa in memoria. Qualsiasi oggetto può modificare il valore di una variabile di classe, ma le variabili di classe possono anche essere manipolate senza creare un'istanza della classe.

Una variabile di classe (dichiarata static) è una posizione comune a tutte le istanze.

Nell'esempio, numberOfBicyclesè una variabile di classe (poiché è dichiarata static). Esiste una sola variabile (cioè posizione) comune a tutte le istanze e alla classe. Quindi, se si modifica numberOfBicyclesin un metodo, altri metodi vedrebbero il nuovo valore (anche per Bicycleoggetti diversi )

Al contrario geare idsono esempio le variabili (perché la loro dichiarazione non ha alcun staticmodificatore). Ogni Bicycleoggetto ha il suo. Se si modifica gearper alcuni Bicycle a , e se b è un'altra istanza, la modifica a.gearnon ha alcun effetto sub.gear

Ogni oggetto Java è una distinta zona di memoria con alcuni metadati (ad esempio un riferimento alla sua classe) e le sue variabili di istanza (forse ereditate da una superclasse). Ma le variabili di classe sono comuni alla classe e condivise da tutte le istanze.

Vedi anche Wiki di variabili oggetto (informatica) e istanza .


4

Variabile di istanza:

  • Le variabili di istanza sono dichiarate in una classe, ma al di fuori di un metodo, costruttore o qualsiasi blocco.
  • La variabile di istanza appartiene all'istanza di una classe oppure si può dire che la variabile di istanza appartiene all'oggetto.
  • La variabile di istanza ha un valore separato per ogni singola istanza della classe.

    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;
    }

Metodo per accedere alla variabile di istanza:

InstanceDemo demo = new InstanceDemo ();

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

Uscita: 2, Test

Variabile di classe:

  • La variabile di classe appartiene alla classe.
  • la variabile di classe viene creata aggiungendo una parola chiave "statica" prima della variabile.
  • Chiamata anche variabile statica.
  • E la variabile di classe più importante mantiene un unico valore condiviso per tutte le istanze di una classe, anche se non esiste alcun oggetto di istanza della classe.

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

Metodo per accedere alla variabile di classe:

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

Uscita: 2

Breve differenza tra la variabile di classe e la variabile di istanza:

  • Le variabili di istanza hanno valori separati per ogni istanza di una classe. Le variabili di classe mantengono un singolo valore condiviso per tutte le istanze della classe, anche se non esiste alcun oggetto istanza di quella classe.
  • Utilizzare la parola chiave statica per modificare una variabile di istanza in una variabile di classe.
  • Entrambe le variabili di istanza e di classe sono dichiarate a livello di classe, non all'interno dei metodi.

3

La differenza tra class variablese instancevariabili, è semplicemente una questione di who knows what?.

An instance variableè noto (= associato ) solo a quell'istanza concreta , da cui il nome.

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

La definizione di una classe è come un progetto per la costruzione di oggetti concreti . Forse questo punto ti confonde un po '. Ma scrivendolo in questo modo, ogni variabile sarebbe legata al suo oggetto concreto: ad esempio, ogni persona ha il suo nome

A class variabled'altra parte è - come dice il nome - noto a tutti i membri di una classe; o tecnicamente: è noto / associato a livello di classe . L'esempio tipico è un contatore di quanti oggetti sono stati creati, sebbene sia un esempio molto problematico; ma non importa in questa fase iniziale.

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

numberOfPersonsviene dichiarato staticquale è la parola chiave per distinguere tra class variablese instance variabes. La variabile è dichiarata come le altre all'interno della definizione di classe. Ma la staticparola chiave segnala che è diversa.

  • firstName, lastNamesono variabili di istanza e associate a quell'istanza concreta

  • numberOfPersons è associato alla classe, in modo che ogni istanza possa accedere a questa variabile.

tl; dr

Il luogo in cui sono definite le variabili è la definizione della classe.

Le variabili di classe sono note a / associate al livello di classe, ovvero ogni istanza concreta ha accesso ad essa. Per definire una variabile di classe, utilizzare la parola chiave static.

Le variabili di istanza sono note solo a livello di istanza. Li definisci senza la staticparola chiave.

Ulteriore documentazione per Java è qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.