Ik ben erg nieuw in Java en wil het verschil begrijpen tussen klassevariabelen en instantievariabelen.
Bijvoorbeeld:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
Hoe verschillen instance variabelen en class variabelen van elkaar? Welke variabelen zijn hier klassevariabelen, en welke zijn instantievariabelen? Hoe beïnvloedt dit het bereik?
Het zijn beide member variabelen, wat betekent dat ze beide geassocieerd zijn met een klasse. Nu zijn er natuurlijk verschillen tussen de twee:
Instance variabelen:
Deze variabelen behoren tot de instantie van een klasse, dus een object. En elke instantie van die klasse (object) heeft zijn eigen kopie van die variabele. Veranderingen die in de variabele worden aangebracht, weerspiegelen zich niet in andere instanties van die klasse.
public class Product {
public int Barcode;
}
Klassevariabelen:
Deze zijn ook gekend als statische lidvariabelen en er'is slechts één kopie van die variabele die gedeeld wordt met alle instanties van die klasse. Als er veranderingen worden aangebracht aan die variabele, zullen alle andere instanties het effect van de veranderingen zien.
public class Product {
public static int Barcode;
}
Volledig voorbeeld:
// 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;
}
De uitvoer zal zijn:
123456
987654
Verander nu de instantievariabele in een klassevariabele door hem statisch te maken:
//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;
}
}
Ik heb niet-statische methodes gebruikt om de waarde van Barcode
te krijgen en in te stellen, om het vanuit het object te kunnen aanroepen en niet vanuit de klasse. De uitvoer zal er als volgt uitzien:
987654
987654
Het wordt hier uitgelegd (met een voorbeeld Bicycle
class met class variabele numberOfBicycles
en instance variabelen cadence
, speed
, gear
& id
):
Soms wil je variabelen hebben die gemeenschappelijk zijn voor alle objecten. Dit wordt bereikt met de
static
modifier. Velden die destatic
modifier in hun declaratie hebben, worden statische velden of klassevariabelen genoemd. Ze worden geassocieerd met de klasse, in plaats van met een object. Elke instantie van de klasse deelt een klassevariabele, die zich op een vaste plaats in het geheugen bevindt. Elk object kan de waarde van een klassevariabele veranderen, maar klassevariabelen kunnen ook worden gemanipuleerd zonder een instantie van de klasse aan te maken.
Een klassevariabele (die statisch
wordt verklaard) is een locatie die alle instanties gemeen hebben.
In het voorbeeld is aantalFietsen
een klassevariabele (omdat het statisch
is verklaard). Er is maar één zo'n variabele (d.w.z. locatie) gemeenschappelijk voor alle instanties en voor de klasse. Dus als je aantalWielers
in één methode wijzigt, zouden andere methoden de nieuwe waarde zien (zelfs voor verschillende Fiets
objecten)
In tegenstelling tot gear
& id
zijn instantie variabelen (omdat hun declaratie geen static
modifier heeft). Elk Fiets
object heeft zijn eigen. Als je gear
wijzigt voor een Wieler
a, en b is een andere instantie, dan heeft het wijzigen van a.gear
geen effect op b.gear
Elk Java object is een aparte geheugen zone met wat meta data (b.v. een referentie naar zijn klasse) en zijn eigen instantie variabelen (misschien geërfd van een superklasse). Maar de klassevariabelen zijn gemeenschappelijk voor de klasse en worden gedeeld door alle instanties.
Zie ook Object (computerwetenschap) & Instantievariabele wikipagina's.
Instantievariabele:
Instance variabelen worden gedeclareerd in een klasse, maar buiten een methode, constructor of een blok.
Instantievariabele behoort tot de instantie van een klasse of je kunt zeggen dat de instantievariabele bij het object hoort.
Instantievariabelen hebben een aparte waarde voor elke instantie van van de klasse.
Klasse InstanceDemo {
// deze instantievariabele is zichtbaar voor elke child class.
public String name = "Testing";
// de variabele count is alleen zichtbaar in de klasse Demo.
private int count = 2;
}
Method to access instance variable:
InstanceDemo demo = new InstanceDemo ();
System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
Uitvoer: 2 , Testen
Klassevariabele:
Klasse variabele behoort tot de klasse.
Klassevariabele wordt aangemaakt door "static" sleutelwoord toe te voegen voor de variabele.
Ook wel statische variabele genoemd.
En de belangrijkste klassevariabele behoudt een enkele gedeelde waarde voor alle instanties van een klasse, zelfs als er geen instantie object van de klasse bestaat.
Klasse KlasseDemo {
// teller variabele is gelijk voor alle instanties van deze klasse
public static int count = 2;
}
Method to access class variable:
System.out.println("Access Class variable: " + ClassDemo.count ); //klassevariabele is direct verwijzend naar klasse-naam
Uitvoer: 2
Klein verschil tussen klassevariabele en instantievariabele: