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

10

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

Ad esempio:

class Bicycle { 
    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?

Ho anche difficoltà a capire come diverse variabili di istanza possono essere diverse l'una dall'altra e tuttavia provengono dalla stessa variabile di classe.

    
posta Skylar Adams 12.08.2015 - 09:15
fonte

4 risposte

28

Sono entrambe variabili membro , il che significa che entrambi sono associati a una classe. Ora, naturalmente, ci sono delle 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 che è condivisa con tutte le istanze di quella classe. Se vengono apportate modifiche a tale 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, modifica 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 Barcode per poterlo chiamare dall'oggetto e non dalla classe. L'output seguirà:

987654

987654

    
risposta data 12.08.2015 - 09:41
fonte
5

Viene spiegato qui (con una classe di esempio Bicycle con variabile di classe numberOfBicycles e istanze variabili cadence , speed , gear & id ):

Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.

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

Nell'esempio, numberOfBicycles è una variabile di classe (poiché è dichiarata static ). Esiste solo una variabile di questo tipo (vale a dire la posizione) comune a tutte le istanze e alla classe. Quindi se modifichi numberOfBicycles in un metodo, gli altri metodi vedrebbero il nuovo valore (anche per diversi oggetti Bicycle )

Al contrario gear & id sono variabili istanza (poiché la loro dichiarazione non ha un modificatore static ). Ogni oggetto Bicycle ha la propria. Se modifichi gear per alcuni Bicycle a e se b è un'altra istanza, la modifica di a.gear non ha alcun effetto su b.gear

Ogni oggetto Java è una zona di memoria distinta con alcuni metadati (ad esempio un riferimento alla sua classe) e le sue proprie 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 Oggetto (informatica) & Variabile di istanza wikipages.

    
risposta data 12.08.2015 - 09:32
fonte
2

Variabile istanza:

  • Le variabili di istanza sono dichiarate in una classe, ma al di fuori di un metodo, costruttore o qualsiasi blocco.
  • La variabile istanza appartiene all'istanza di una classe o puoi dire quella variabile di istanza appartiene all'oggetto.
  • Le variabili di istanza hanno un valore separato di ciascuna istanza di la 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;
    }
    

Method to access instance variable:

InstanceDemo demo = new InstanceDemo ();

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

Output: 2 , Testing

Variabile di classe:

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

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

Method to access class variable:

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

Output: 2

Breve differenza tra variabile di classe e 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 di la classe, anche se non esiste un oggetto istanza di quella classe.
  • Si utilizzerà la parola chiave static per modificare una variabile di istanza in una variabile di classe.
  • Sia l'istanza che le variabili di classe sono dichiarate a livello di classe, non all'interno dei metodi.
risposta data 12.08.2015 - 13:36
fonte
2

La differenza tra class variables e instance variabili, è semplicemente una domanda di who knows what? .

Un instance variable è noto solo (= associato ) a quell'istanza concrete - 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 scrivendo in questo modo, ogni variabile sarebbe legata al suo oggetto concreto: ad es. Ogni persona ha il suo firstName

Un class variable d'altra parte è - come dice il nome - noto a tutti i membri di una classe; o tecnicamente: è noto / vincolato a livello di classe . L'esempio tipico è un contatore di quanti oggetti, tu hai creato - 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
  }

numberOfPersons è dichiarato static che è la parola chiave da distinguere tra class variables e instance variabes . La variabile è dichiarata come gli altri all'interno della definizione della classe. Ma la parola chiave static segnala che è diverso.

  • firstName , lastName sono variabili di istanza e associati a quell'istanza concreta

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

tl; dr

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

Le variabili di classe sono conosciute / vincolate al livello di classe, cioè ogni istanza concreta ha accesso ad essa. Per definire una variabile di classe, si utilizza la parola chiave static .

Le variabili di istanza sono conosciute solo a livello di istanza. Li definisci senza la parola chiave static .

Ulteriore documentazione per Java è qui

    
risposta data 12.08.2015 - 15:04
fonte

Leggi altre domande sui tag