Wat zijn de verschillen tussen klassevariabelen en instantievariabelen in Java? [gesloten]
Geplaatst op januari 1, 2021 door adminReacties
- Het lijkt erop dat je begonnen bent met het lezen van De Java ™ Tutorials: inzicht in klasleden die legt dit uit, maar heb ' t niet volledig begrepen.
Antwoord
Ze zijn allebei lid -variabelen, wat betekent dat ze allebei aan een klasse zijn gekoppeld. Nu zijn er natuurlijk verschillen tussen de twee:
Instancevariabelen:
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. Wijzigingen die aan de variabele worden aangebracht, worden niet weerspiegeld in andere instanties van die klasse.
public class Product { public int Barcode; }
Klassevariabelen:
Deze zijn ook bekend als statische lidvariabelen en er is slechts één kopie van die variabele die wordt gedeeld met alle instanties van die klasse. Als er wijzigingen worden aangebracht in die variabele, zullen alle andere instanties het effect van de wijzigingen 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 deze 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 methoden gebruikt om haal en stel de waarde van Barcode
in om het vanuit het object te kunnen aanroepen en niet fr in de klas. De uitvoer zal als volgt zijn:
987654
987654
Opmerkingen
- Waarom een C # -voorbeeld voor een Java-vraag?
- Mijn gedachten precies. Ik ken alleen Java-programmering, niet C #, dus je hebt geen heb veel geholpen
- @BasileStarynkevitch Ik ' ben voornamelijk een C # -ontwikkelaar en aangezien het principe voor beide geldt en zo goed als hetzelfde is, leverde ik snel een C # voorbeeld, fout van mij natuurlijk. 🙂 Mijn voorbeeld gewijzigd in Java.
- @SkylarAdams Sorry, ik heb ten onrechte te snel aangenomen dat iedereen die Java kent, C # kent. Ik heb het voorbeeld veranderd in een Java-versie, hoop dat het helpt.
- Voor dit soort vragen denk ik dat het niet relevant is, of ik Java of C # gebruik,
Antwoord
Het wordt hier uitgelegd (met een voorbeeld Bicycle
klasse met klassevariabele numberOfBicycles
en instantievariabelen cadence
, speed
, gear
& id
):
Soms wilt u 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 zijn geassocieerd met de klasse, in plaats van met enig object. Elke instantie van de klasse deelt een klassenvariabele, die zich op één vaste locatie in het geheugen bevindt. Elk object kan de waarde van een klassevariabele wijzigen, maar klassevariabelen kunnen ook worden gemanipuleerd zonder een instantie van de klasse te maken.
Een klassevariabele (gedeclareerd static
) is een gemeenschappelijke locatie voor alle instanties.
In het voorbeeld is numberOfBicycles
een klassevariabele (aangezien het is gedeclareerd static
). Er is slechts één dergelijke variabele (d.w.z. locatie) die alle instanties en de klasse gemeen hebben. Dus als u numberOfBicycles
in één methode wijzigt, zouden andere methoden de nieuwe waarde zien (zelfs voor verschillende Bicycle
objecten)
gear
& id
zijn daarentegen instantie variabelen (omdat hun declaratie geen static
modifier heeft). Elk Bicycle
-object heeft zijn eigen. Als u gear
wijzigt voor sommigen Bicycle
a , en als b een andere is het wijzigen van a.gear
heeft geen effect op b.gear
Elk Java-object is een aparte geheugenzone met enkele metagegevens (bv. enige verwijzing naar zijn klasse) en zijn eigen instantievariabelen (misschien geërfd van een superklasse).Maar de klassevariabelen zijn gemeenschappelijk voor de klas en worden door alle instanties gedeeld.
Zie ook Object (informatica) & Instantievariabele wikipages.
Antwoord
Instancevariabele:
- Instancevariabelen worden gedeclareerd in een klasse, maar buiten een methode, constructor of welk blok dan ook.
- Instantievariabele hoort bij de instantie van een klasse of je kunt zeggen dat die instantievariabele bij het object hoort.
-
Instancevariabele hebben afzonderlijke waarde van elke instantie van de 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 om toegang te krijgen tot instantievariabele:
InstanceDemo demo = new InstanceDemo (); System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
Uitvoer: 2, testen
Klasse-variabele:
- Klasse-variabele behoort tot de klasse.
- Klasse-variabele wordt gemaakt door een statisch trefwoord 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.
Class ClassDemo { // count variable is Same for all instance of this class public static int count = 2; }
Methode om toegang te krijgen tot klassenvariabele:
System.out.println("Access Class variable: " + ClassDemo.count ); //class variable is directly refer with class name
Uitvoer: 2
Kort verschil tussen klassevariabele en instantievariabele:
- Instantievariabelen hebben aparte waarden voor elk instantie van een klasse. Klassevariabelen behouden een enkele gedeelde waarde voor alle instanties van de klasse, zelfs als er geen instantieobject van die klasse bestaat.
- U zou het statische trefwoord gebruiken om een instantievariabele in een klassevariabele te veranderen.
- Zowel instantie- als klassevariabelen worden gedeclareerd op klassenniveau, niet binnen methoden.
Antwoord
Het verschil tussen class variables
en instance
variabelen, is gewoon een kwestie van who knows what?
.
Een instance variable
is alleen bekend (= gebonden ) naar die concrete instantie – vandaar de naam.
public class Person { private String firstName; private String lastName; [...] }
De definitie van een klasse is als een blauwdruk voor het bouwen van concrete objecten. Misschien verwart je een beetje door dit punt. Maar als je het op deze manier schrijft, zou elke variabele gebonden zijn aan zijn concrete object: bijv. Elke persoon heeft zijn eigen voornaam
Een class variable
is daarentegen – zoals de naam al zegt – bekend bij elk lid van een klas; of technisch: het is bekend / gebonden op klassenniveau . Het typische voorbeeld is een teller van hoeveel objecten je hebt gemaakt – hoewel het een erg problematisch voorbeeld is; maar dat maakt in dit vroege stadium niet uit.
public class Person { private String firstName; private String lastName; [...] static int numberOfPersons = 0 }
numberOfPersons
wordt verklaard static
wat het sleutelwoord is om onderscheid te maken tussen class variables
en instance variabes
. De variabele wordt gedeclareerd zoals de anderen binnen de klassedefinitie . Maar het static
zoekwoord geeft aan dat het anders is.
-
firstName
,lastName
zijn instantievariabelen en gebonden aan die concrete instantie -
numberOfPersons
is gebonden aan de klasse, zodat elke instantie toegang heeft tot deze variabele.
tl; dr
De plaats waar variabelen worden gedefinieerd, is de klassedefinitie.
Klassevariabelen zijn bekend op / gebonden aan het klassenniveau, dwz elk concreet instantie heeft er toegang toe. Om een klassenvariabele te definiëren, gebruikt u het trefwoord static
.
I nstance-variabelen zijn alleen bekend op instantieniveau. U definieert ze zonder het static
sleutelwoord.
Verdere documentatie voor Java is hier
Geef een reactie