Hva er forskjellen mellom klassevariabler og instansvariabler i Java?

Jeg er veldig ny i Java og ønsker å forstå forskjellen mellom klassevariabler og instansvariabler.

For eksempel:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

Hva er forskjellen på instansvariabler og klassevariabler? Hvilke variabler her er klassevariabler, og hvilke er instansvariabler? Hvordan påvirker dette omfanget?

Begge er medlemsvariabler, noe som betyr at begge er knyttet til en klasse. Nå er det selvfølgelig forskjeller mellom de to:

**Instansvariabler

Disse variablene tilhører instansen av en klasse, altså et objekt. Og hver forekomst av klassen (objektet) har sin egen kopi av variabelen. Endringer som gjøres i variabelen, gjenspeiles ikke i andre forekomster av klassen.

public class Product {
    public int Barcode;
}

Klassevariabler:

Disse er også kjent som statiske medlemsvariabler, og det finnes bare én kopi av denne variabelen som deles med alle forekomster av klassen. Hvis det gjøres endringer i denne variabelen, vil alle andre instanser 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;
}

Resultatet blir:

123456

987654

Nå endrer du 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 å hente og angi verdien til Barcode for å kunne kalle den fra objektet og ikke fra klassen. Resultatet blir som følger:

987654

987654

Kommentarer (5)

Det forklares her (med et eksempel på klassen Bicycle med klassevariabelen numberOfBicycles og instansvariablene cadence, speed, gear & id):

Noen ganger ønsker man å ha variabler som er felles for alle objekter. Dette gjøres med modifikatoren static. Felt som har modifikatoren static i deklarasjonen, kalles statiske felt eller klassevariabler. De er knyttet til klassen, og ikke til et hvilket som helst objekt. Alle forekomster av klassen deler en klassevariabel, som ligger på en fast plass i minnet. Ethvert objekt kan endre verdien til en klassevariabel, men klassevariabler kan også manipuleres uten å opprette en forekomst av klassen.

En klassevariabel (deklarert static) er en plassering som er felles for alle forekomster.

I eksemplet er numberOfBicycles en klassevariabel (siden den er erklært static). Det finnes bare én slik variabel (dvs. plassering) som er felles for alle instanser og for klassen. Så hvis du endrer numberOfBicycles i én metode, vil andre metoder se den nye verdien (selv for forskjellige Bicycle-objekter).

I motsetning til dette er gear & id instans-variabler (fordi deklarasjonen deres ikke har noen statisk modifikator). Hvert Bicycle-objekt har sin egen. Hvis du endrer gear for en Bicycle a, og hvis b er en annen instans, vil det å endre a.gear ikke ha noen innvirkning på b.gear.

Hvert Java-objekt er en egen minnesone med noen metadata (f.eks. en referanse til sin klasse) og sine egne instansvariabler (kanskje arvet fra en superklasse). Men klassevariablene er felles for klassen og deles av alle instanser.

Se også wikisidene Objekt (informatikk) & Instansvariabel.

Kommentarer (0)

Instansvariabel:

  • Instansvariabler deklareres i en klasse, men utenfor en metode, konstruktør eller en blokk.

  • Forekomstvariabel tilhører forekomsten av en klasse, eller man kan si at eller man kan si at instansvariabelen tilhører objektet.

  • Instansvariabler har en egen verdi for hver forekomst av klassen. klassen.

     Klasse InstanceDemo {
    
          // Denne instansvariabelen er synlig for alle underordnede klasser.
            public String name = "Testing";
    
          // count-variabelen er bare synlig i klassen Demo.
            private int count = 2;
     }

Metode for å få tilgang til forekomstvariabel:

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

Output: 2 , Testing

Klassevariabel:

  • Klassevariabel tilhører klassen.

  • klassevariabel opprettes ved å legge til nøkkelordet "static" før variabelen. variabelen.

  • Kalles også statisk variabel.

  • Og viktigst av alt, klassevariabler opprettholder én felles verdi for alle alle forekomster av en klasse, selv om det ikke finnes noe objekt av klassen. eksisterer.

         Klasse ClassDemo {
    
          // count-variabelen er den samme for alle forekomster av denne klassen
            public static int count = 2;
     }

Metode for å få tilgang til klassevariabel:

System.out.println("Få tilgang til klassevariabel: " + ClassDemo.count ); //klassevariabel refereres direkte med klassenavn

Output: 2

Kort om forskjellen mellom klassevariabel og instansvariabel:.

  • Instansvariabler har separate verdier for hver forekomst av en klasse. Klassevariabler har én felles verdi for alle forekomster av klassen, selv om det ikke finnes klassen, selv om det ikke finnes noen forekomst av klassen.
  • Du bruker nøkkelordet static for å endre en instansvariabel til en klassevariabel. en klassevariabel.
  • Både instans- og klassevariabler deklareres på klassenivå, ikke i metoder.
Kommentarer (0)