Quali sono le differenze tra le variabili di classe e le variabili di istanza in Java? [chiuso]
Su Gennaio 1, 2021 da adminCommenti
- Sembra che tu abbia iniziato a leggere Le esercitazioni Java ™: comprensione dei membri della classe che spiega questo, ma non lho ' completamente compreso.
Risposta
Entrambe sono variabili membro , il che significa che entrambe sono associate a una classe. Ora, ovviamente, 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 note 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 quella variabile, tutte le altre istanze vedranno leffetto 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; }
Loutput 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 Barcode
per poterlo richiamare dalloggetto e non da fr om la classe. Loutput sarà il seguente:
987654
987654
Commenti
- Perché un esempio C # per una domanda su Java?
- I miei pensieri esattamente. Conosco solo la programmazione Java non C #, quindi non stato di grande aiuto
- @BasileStarynkevitch I ' sono principalmente uno sviluppatore C # e poiché il principio conta per entrambi ed è uguale allo stesso, ho fornito rapidamente un C # esempio, sbagliato da parte mia ovviamente. 🙂 Ho cambiato il mio esempio in Java.
- @SkylarAdams Scusa, ho erroneamente presunto troppo rapidamente che chiunque conosca Java, conosce C #. Ho cambiato lesempio in uno Java, spero che aiuti.
- Per questo tipo di domande, penso che sia irrilevante, sia che si utilizzi Java o C #,
Risposta
È spiegato qui (con un esempio Bicycle
classe con variabile di classe numberOfBicycles
e variabili di istanza cadence
, speed
, gear
& id
):
A volte, vuoi avere variabili comuni a tutti gli oggetti. Ciò si ottiene con il modificatore
static
. I campi che hanno il modificatorestatic
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 nella memoria. Qualsiasi oggetto può modificare il valore di una variabile di classe, ma le variabili di classe possono anche essere manipolate senza creare unistanza della classe.
Una variabile di classe (dichiarata static
) è un percorso comune a tutte le istanze.
Nellesempio, numberOfBicycles
è una variabile di classe (poiché è dichiarata static
). Esiste solo una di queste variabili (ovvero 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 Bicycle
oggetti)
Al contrario, gear
& id
sono variabili istanza (perché la loro dichiarazione non ha alcun modificatore static
). Ogni oggetto Bicycle
ne ha uno proprio. Se modifichi gear
per alcuni Bicycle
a e se b è un altro istanza, la modifica di a.gear
non ha alcun effetto su b.gear
Ogni oggetto Java è una zona di memoria distinta con alcuni metadati (es. qualche riferimento alla sua classe) e alle 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 Object (informatica) & Variabile istanza wikipages.
Risposta
Variabile di istanza:
- Le variabili di istanza sono dichiarate in una classe, ma al di fuori di un metodo, un costruttore o qualsiasi blocco.
- La variabile di istanza appartiene allistanza di una classe oppure si può dire che la variabile di istanza appartiene alloggetto.
-
La variabile di istanza ha valore separato di 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 );
Output: 2, test
Variabile di classe:
- La variabile di classe appartiene alla classe.
- La variabile di classe viene creata aggiungendo la 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 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
Output: 2
Breve differenza tra variabile di classe e variabile di istanza:
- Le variabili di istanza hanno valori separati per ciascuna istanza di una classe. Le variabili di classe mantengono un unico valore condiviso per tutte le istanze della classe, anche se non esiste alcun oggetto istanza di quella classe.
- Dovresti usare la parola chiave statica per cambiare una variabile di istanza in una variabile di classe.
- Sia le variabili di istanza che quelle di classe sono dichiarate a livello di classe, non allinterno di metodi.
Risposta
La differenza tra le variabili class variables
e instance
è semplicemente una questione di who knows what?
.
Un instance variable
è noto solo (= bound ) a quellistanza concreta , da cui il nome.
public class Person { private String firstName; private String lastName; [...] }
La definizione di una classe è come un progetto per costruire oggetti concreti . Forse questo punto ti confonde un po . Ma scrivendolo in questo modo, ogni variabile sarebbe vincolata al suo oggetto concreto: ad es. Ogni persona ha il suo firstName
Daltra parte, un class variable
è – come dice il nome – noto a tutti i membri di una classe; o tecnicamente: è noto / vincolato a livello di classe . Lesempio tipico è un contatore di quanti oggetti 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 per distinguere tra class variables
e instance variabes
. La variabile è dichiarata come le altre allinterno della definizione della classe . Ma la parola chiave static
segnala che è diversa.
-
firstName
,lastName
sono variabili di istanza e legate a quellistanza 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 note / legate al livello di classe, cioè ogni calcestruzzo istanza ha accesso ad essa. Per definire una variabile di classe, utilizza la parola chiave static
.
I Le variabili di istanza sono note solo a livello di istanza. Li definisci senza la static
parola chiave.
Ulteriore documentazione per Java è qui
Lascia un commento