Hvad er forskellen mellem klassevariabler og instansvariabler i Java? [lukket]
On januar 1, 2021 by adminKommentarer
- Du ser ud til at være begyndt at læse Java ™ -vejledningerne: Forstå klassemedlemmer som forklarer dette, men har ikke ' ikke forstået det fuldt ud.
Svar
De er begge medlem -variabler, hvilket betyder at begge er knyttet til en klasse. Nu er der selvfølgelig forskelle mellem de to:
Instansvariabler:
Disse variabler hører til forekomsten af en klasse og dermed et objekt. Og hver forekomst af den klasse (objekt) har sin egen kopi af variablen. Ændringer foretaget i variablen afspejler ikke i andre tilfælde af denne klasse.
public class Product { public int Barcode; }
Klassevariabler:
Disse er også kendt som statiske medlemsvariabler og der er kun en kopi af den variabel, der deles med alle forekomster af den klasse. Hvis der foretages ændringer i den variabel, vil alle andre forekomster se effekten af ændringerne.
public class Product { public static int Barcode; }
Fuldt eksempel:
// 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; }
Outputtet bliver:
123456
987654
Nu skal du ændre forekomstvariablen til en klassevariabel ved at gøre den statisk:
//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; } }
Jeg brugte ikke-statiske metoder til få og indstil værdien af Barcode
for at kunne kalde det fra objektet og ikke fr om klassen. Outputtet følger:
987654
987654
Kommentarer
- Hvorfor et C # -eksempel på et Java-spørgsmål?
- Mine tanker nøjagtigt. Jeg kender kun Java-programmering ikke C #, så du har ikke været til stor hjælp
- @ BasileStarynkevitch I ' Jeg er hovedsagelig en C # -udvikler, og da princippet tæller for begge og er lige så godt som det samme, leverede jeg hurtigt en C # eksempel, forkert af mig selvfølgelig. 🙂 Ændrede mit eksempel til Java.
- @SkylarAdams Desværre antog jeg fejlagtigt for hurtigt, at enhver, der kender Java, kender C #. Jeg ændrede eksemplet til en Java, håber det hjælper.
- For denne type spørgsmål synes jeg, det er irrelevant, hvad enten jeg bruger Java eller C #,
Svar
Det forklares her (med et eksempel Bicycle
klasse med klassevariabel numberOfBicycles
og forekomstvariabler cadence
, speed
, gear
& id
):
Nogle gange vil du have variabler, der er fælles for alle objekter. Dette opnås med
static
modifikatoren. Felter, der harstatic
modifikatoren i deres erklæring kaldes statiske felter eller klassevariabler. De er forbundet med klassen snarere end med noget objekt. Hver forekomst af klassen deler en klassevariabel, der er på et fast sted i hukommelsen. Ethvert objekt kan ændre værdien af en klassevariabel, men klassevariabler kan også manipuleres uden at oprette en forekomst af klassen.
En klassevariabel (erklæret static
) er en placering, der er fælles for alle forekomster.
I eksemplet er numberOfBicycles
en klassevariabel (da den er erklæret static
). Der er kun en sådan variabel (dvs. placering), der er fælles for alle forekomster og for klassen. Så hvis du ændrer numberOfBicycles
på en metode, ville andre metoder se den nye værdi (selv for forskellige Bicycle
objekter)
I modsætning hertil er gear
& id
forekomst variabler (fordi deres erklæring ikke har nogen static
modifikator). Hvert Bicycle
objekt har sin egen. Hvis du ændrer gear
for nogle Bicycle
a , og hvis b er en anden Ændring af a.gear
har f.eks. ingen effekt på b.gear
Hvert Java-objekt er en særskilt hukommelseszone med nogle metadata (f.eks. en vis henvisning til dens klasse) og dens egne instansvariabler (måske arvet fra en superklasse).Men klassevariablerne er fælles for klassen og deles af alle forekomster.
Se også Objekt (datalogi) & Instansvariabel wikipages.
Svar
Instansvariabel:
- Forekomstvariabler erklæres i en klasse, men uden for en metode, konstruktør eller en hvilken som helst blok.
- Instansvariabel tilhører forekomsten af en klasse, eller du kan sige, at instansvariablen tilhører objektet.
-
Instansvariabler har separat værdi for hver forekomst af klassen.
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; }
Metode til at få adgang til instansvariabel:
InstanceDemo demo = new InstanceDemo (); System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
Output: 2, Testning
Klassevariabel:
- Klassevariabel tilhører klassen.
- klassevariabel oprettes ved at tilføje “statisk” nøgleord før variablen.
- Også kaldet statisk variabel.
-
Og det vigtigste klassevariabel opretholder en fælles delt værdi for alle forekomster af en klasse, selv hvis der ikke findes noget instansobjekt i klassen.
Class ClassDemo { // count variable is Same for all instance of this class public static int count = 2; }
Metode til at få adgang til klassevariabel:
System.out.println("Access Class variable: " + ClassDemo.count ); //class variable is directly refer with class name
Output: 2
Kort forskel mellem klassevariabel og instansvariabel:
- Instansvariabler har separate værdier for hver eksempel på en klasse. Klassevariabler opretholder en enkelt delt værdi for alle forekomster af klassen, selvom der ikke findes noget instansobjekt for denne klasse.
- Du bruger det statiske nøgleord til at ændre en instansvariabel til en klassevariabel.
- Både forekomst- og klassevariabler erklæres på klasseniveau, ikke inden for metoder.
Svar
Forskellen mellem class variables
og instance
variabler, er simpelthen et spørgsmål om who knows what?
.
En instance variable
er kun kendt (= bundet ) til den konkrete forekomst – deraf navnet.
public class Person { private String firstName; private String lastName; [...] }
Definitionen af en klasse er som en blueprint til bygning af beton genstande. Måske forvirrer dette punkt dig lidt. Men når man skriver det på denne måde, vil hver variabel være bundet til sit konkrete objekt: f.eks. Hver person har sit eget fornavn
A class variable
er på den anden side – som navnet siger – kendt af hvert medlem af en klasse; eller teknisk: Det er kendt / bundet på klasseniveau . Det typiske eksempel er en tæller for hvor mange objekter, du har oprettet – selvom det er et meget problematisk eksempel; men det betyder ikke noget på dette tidlige tidspunkt.
public class Person { private String firstName; private String lastName; [...] static int numberOfPersons = 0 }
numberOfPersons
erklæres static
som er nøgleordet til distingush mellem class variables
og instance variabes
. Variablen erklæres som de andre inden for klassedefinitionen . Men nøgleordet static
signalerer, at det er anderledes.
-
firstName
,lastName
er instansvariabler og bundet til den konkrete forekomst -
numberOfPersons
er bundet til klassen, så enhver instans kunne få adgang til denne variabel.
tl; dr
Det sted, hvor variabler er defineret, er klassedefinitionen.
Klassevariabler er kendt på / bundet til klasseniveau, dvs. hver konkret instans har adgang til det. For at definere en klassevariabel bruger du nøgleordet static
.
I nstansvariabler er kun kendt på et instansniveau. Du definerer dem uden static
nøgleordet.
Yderligere dokumentation for Java er her
Skriv et svar