Hva er forskjellen mellom klassevariabler og forekomstvariabler i Java? [lukket]
On januar 1, 2021 by adminKommentarer
- Det ser ut til at du har begynt å lese Java ™ -veiledningene: Forstå klassemedlemmer som forklarer dette, men har ikke ' ikke forstått det fullt.
Svar
Begge er medlems variabler, noe som betyr at begge er knyttet til en klasse. Nå er det selvfølgelig forskjeller mellom de to:
Forekomstvariabler:
Disse variablene tilhører forekomsten av en klasse , og dermed et objekt. Og hver forekomst av den klassen (objektet) har sin egen kopi av variabelen. Endringer som er gjort på variabelen, gjenspeiler ikke i andre tilfeller av den klassen.
public class Product { public int Barcode; }
Klassevariabler:
Disse er også kjent som statiske medlemsvariabler og det er bare en kopi av variabelen som deles med alle forekomster av den klassen. Hvis det gjøres endringer i den variabelen, vil alle andre forekomster se effekten av endringene.
public class Product { public static int Barcode; }
Fullstendig 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; }
Utgangen blir:
123456
987654
Nå kan du endre forekomstvariabelen til en klassevariabel ved å gjø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 brukte ikke-statiske metoder for å få og sett verdien til Barcode
for å kunne kalle den fra objektet og ikke fr om klassen. Utgangen vil være følgende:
987654
987654
Kommentarer
- Hvorfor et C # -eksempel for et Java-spørsmål?
- Mine tanker nøyaktig. Jeg vet bare Java-programmering ikke C #, så du har ikke vært til stor hjelp
- @BasileStarynkevitch I ' Jeg er hovedsakelig en C # -utvikler, og siden prinsippet teller for begge deler og er like bra som det samme, ga jeg raskt en C # eksempel, feil av meg selvfølgelig. 🙂 Endret eksemplet mitt til Java.
- @SkylarAdams Beklager, jeg antok feilaktig for raskt at alle som kjenner Java, kjenner C #. Jeg endret eksemplet til Java, håper det hjelper.
- For denne typen spørsmål synes jeg det er irrelevant, enten jeg bruker Java eller C #,
Svar
Det forklares her (med et eksempel Bicycle
klasse med klassevariabel numberOfBicycles
og forekomstvariabler cadence
, speed
, gear
& id
):
Noen ganger vil du ha variabler som er felles for alle objekter. Dette oppnås med
static
modifikatoren. Felter som harstatic
modifikator i erklæringen kalles statiske felt eller klassevariabler. De er assosiert med klassen, snarere enn med noe objekt. Hver forekomst av klassen deler en klassevariabel, som er på et fast sted i minnet. Ethvert objekt kan endre verdien på en klassevariabel, men klassevariabler kan også manipuleres uten å opprette en forekomst av klassen.
En klassevariabel (erklært static
) er et sted som er felles for alle tilfeller.
I eksemplet er numberOfBicycles
en klassevariabel (siden den er erklært static
). Det er bare en slik variabel (dvs. plassering) som er felles for alle forekomster og for klassen. Så hvis du endrer numberOfBicycles
på en metode, vil andre metoder se den nye verdien (selv for forskjellige Bicycle
objekter)
I kontrast gear
& id
er forekomst variabler (fordi erklæringen deres ikke har noen static
modifikator). Hvert Bicycle
-objekt har sitt eget. Hvis du endrer gear
for noen Bicycle
a , og hvis b er en annen Endring av a.gear
har for eksempel ingen effekt på b.gear
Hvert Java-objekt er en distinkt minnesone med noen metadata (f.eks. noen referanser til klassen) og dens egne forekomstvariabler (kanskje arvet fra en superklasse).Men klassevariablene er felles for klassen og deles av alle forekomster.
Se også Objekt (informatikk) & Instansvariabel wikipages.
Svar
Forekomstvariabel:
- Forekomstvariabler er deklarert i en klasse, men utenfor en metode, konstruktør eller hvilken som helst blokk.
- Forekomstvariabel tilhører forekomsten av en klasse, eller du kan si at forekomstvariabelen tilhører objektet.
-
Forekomstvariabelen har separat verdi for hver forekomst av 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 for å få tilgang til forekomstvariabel:
InstanceDemo demo = new InstanceDemo (); System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
Utgang: 2, Testing
Klassevariabel:
- Klassevariabel tilhører klassen.
- klassevariabel opprettes ved å legge til «statisk» nøkkelord før variabelen.
- Også kalt statisk variabel.
-
Og den viktigste klassevariabelen opprettholder en enkelt delt verdi for alle forekomster av en klasse, til og med hvis ingen forekomstobjekt for klassen eksisterer.
Class ClassDemo { // count variable is Same for all instance of this class public static int count = 2; }
Metode for å få tilgang til klassevariabelen:
System.out.println("Access Class variable: " + ClassDemo.count ); //class variable is directly refer with class name
Utgang: 2
Kort forskjell mellom klassevariabel og instansvariabel:
- Forekomstvariabler har separate verdier for hver forekomst av en klasse. Klassevariabler opprettholder en enkelt delt verdi for alle forekomster av klassen, selv om det ikke eksisterer noe forekomstobjekt for den klassen.
- Du vil bruke det statiske nøkkelordet til å endre en forekomstvariabel til en klassevariabel.
- Både forekomst- og klassevariabler blir erklært på klassenivå, ikke innenfor metoder.
Svar
Forskjellen mellom class variables
og instance
variabler, er rett og slett et spørsmål om who knows what?
.
En instance variable
er bare kjent (= bundet ) til den konkrete forekomsten – derav navnet.
public class Person { private String firstName; private String lastName; [...] }
Definisjonen av en klasse er som en blåkopi for å bygge betong gjenstander. Kanskje dette punktet forvirrer deg litt. Men når du skriver det på denne måten, vil hver variabel være bundet til sitt konkrete objekt: f.eks. Hver person har sitt eget fornavn
A class variable
derimot er – som navnet sier – kjent for hvert medlem av en klasse; eller teknisk: Det er kjent / bundet på klassenivå . Det typiske eksemplet er en teller for hvor mange objekter du har opprettet – selv om det er et veldig problematisk eksempel; men det spiller ingen rolle på dette tidlige stadiet.
public class Person { private String firstName; private String lastName; [...] static int numberOfPersons = 0 }
numberOfPersons
blir erklært static
som er nøkkelordet til distingush mellom class variables
og instance variabes
. Variabelen blir erklært som de andre innenfor klassedefinisjonen . Men nøkkelordet static
signaliserer at det er annerledes.
-
firstName
,lastName
er forekomstvariabler og bundet til den konkrete forekomsten -
numberOfPersons
er bundet til klassen, slik at hver forekomst kan få tilgang til denne variabelen.
tl; dr
Stedet der variabler er definert er klassedefinisjonen.
Klassevariabler er kjent på / bundet til klassenivået, dvs. hver konkret forekomst har tilgang til den. For å definere en klassevariabel bruker du nøkkelordet static
.
I nstansvariabler er bare kjent på et instansnivå. Du definerer dem uten static
søkeordet.
Ytterligere dokumentasjon for Java er her
Legg igjen en kommentar