Jakie są różnice między zmiennymi klasowymi a zmiennymi instancji w Javie? [Zamknięte]

16

Jestem bardzo nowy w Javie i chcę zrozumieć różnicę między zmiennymi klas i zmiennymi instancji.

Na przykład:

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

W jaki sposób zmienne instancji i zmienne klas różnią się od siebie? Które zmienne tutaj są zmiennymi klasowymi, a które zmiennymi instancji? Jak to wpływa na zakres?

Skylar Adams
źródło
1
Wygląda na to, że zacząłeś czytać samouczki Java ™: Zrozumienie członków klasy, które to wyjaśnia, ale nie do końca je zrozumiałem.

Odpowiedzi:

35

Obaj są członkami zmienne, co oznacza, że obie są związane z klasą. Oczywiście są między nimi różnice:

Zmienne instancji:

Te zmienne należą do instancji klasy , a więc obiektu. I każda instancja tej klasy (obiektu) ma własną kopię tej zmiennej. Zmiany wprowadzone w zmiennej nie odzwierciedlają się w innych instancjach tej klasy.

public class Product {
    public int Barcode;
}

Zmienne klasowe:

Są one również znane jako statyczne zmienne składowe i istnieje tylko jedna kopia tej zmiennej, która jest współdzielona ze wszystkimi instancjami tej klasy. Jeśli zmiany zostaną wprowadzone w tej zmiennej, wszystkie inne wystąpienia zobaczą wpływ zmian.

public class Product {
    public static int Barcode;
}

Pełny przykład:

// 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;
}

Dane wyjściowe będą:

123456

987654

Teraz zmień zmienną instancji na zmienną klasy, ustawiając ją na statyczną:

//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;
    }
}

Użyłem metod niestatycznych, aby uzyskać i ustawić wartość, Barcodeaby móc wywoływać ją z obiektu, a nie z klasy. Dane wyjściowe będą następujące:

987654

987654

Abbas
źródło
Dlaczego przykład w języku C # dla pytania Java?
Basile Starynkevitch,
Myślami exactly.I wiem tylko java programowanie nie C #, więc miałaś było zbyt pomocne
Skylar Adams
1
@BasileStarynkevitch Jestem głównie programistą C #, a ponieważ zasada jest ważna dla obu i jest tak samo dobra jak ta sama, szybko podałem przykład C #, oczywiście o mnie źle. :) Zmieniłem mój przykład na Javę.
Abbas,
2
@SkylarAdams Przepraszam, błędnie założyłem, że każdy, kto zna Javę, zna C #. Zmieniłem przykład na Java, mam nadzieję, że to pomoże.
Abbas,
9
W przypadku tego rodzaju pytań uważam, że nie ma znaczenia, czy używa się Javy, czy C #,
Thomas Junk
6

To wyjaśniono tutaj (z przykładu Bicycleklasie klasy zmiennej numberOfBicyclesi instancji zmiennych cadence, speed, geari id)

Czasami chcesz mieć zmienne wspólne dla wszystkich obiektów. Dokonuje się tego za pomocą staticmodyfikatora. Pola, które mają staticmodyfikatory w swojej deklaracji, nazywane są polami statycznymi lub zmiennymi klas. Są one powiązane z klasą, a nie z dowolnym obiektem. Każde wystąpienie klasy dzieli zmienną klasy, która znajduje się w jednym ustalonym miejscu w pamięci. Każdy obiekt może zmienić wartość zmiennej klasy, ale zmiennymi klasy można także manipulować bez tworzenia instancji klasy.

Zmienna klasy (zadeklarowana static) to lokalizacja wspólna dla wszystkich instancji.

W tym przykładzie numberOfBicyclesjest zmienną klasową (ponieważ jest zadeklarowana static). Jest tylko jedna taka zmienna (tj. Lokalizacja) wspólna dla wszystkich instancji i dla klasy. Więc jeśli zmodyfikujesz numberOfBicyclesjedną metodą, inne metody zobaczą nową wartość (nawet dla różnych Bicycleobiektów)

Natomiast gear& idsą zmiennymi instancji (ponieważ ich deklaracja nie ma staticmodyfikatora). Każdy Bicycleprzedmiot ma swój własny. Jeśli zmodyfikujesz geardla Bicycle a , a b jest inną instancją, modyfikacja a.gearnie ma wpływu nab.gear

Każdy obiekt Java jest odrębną strefą pamięci z pewnymi metadanymi (np. Odniesieniem do swojej klasy) i własnymi zmiennymi instancji (być może odziedziczonymi z nadklasy). Ale zmienne klasy są wspólne dla klasy i wspólne dla wszystkich instancji.

Zobacz także Wikipedie zmienne dotyczące obiektów (informatyka) i instancji .

Basile Starynkevitch
źródło
4

Zmienna wystąpienia:

  • Zmienne instancji są deklarowane w klasie, ale poza metodą, konstruktorem lub dowolnym blokiem.
  • Zmienna instancji należy do instancji klasy lub można powiedzieć, że zmienna instancji należy do obiektu.
  • Zmienna instancji ma osobną wartość dla każdej instancji klasy.

    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;
    }

Metoda dostępu do zmiennej instancji:

InstanceDemo demo = new InstanceDemo ();

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

Wyjście: 2, testowanie

Zmienna klasy:

  • Zmienna klasy należy do klasy.
  • Zmienna klasy jest tworzona przez dodanie słowa kluczowego „static” przed zmienną.
  • Nazywany również zmienną statyczną.
  • I najważniejsza zmienna klasowa utrzymuje jedną wspólną wartość dla wszystkich instancji klasy, nawet jeśli nie istnieje żaden obiekt klasy.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }

Metoda dostępu do zmiennej klasy:

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

Wyjście: 2

Krótka różnica między zmienną klasy a zmienną instancji:

  • Zmienne instancji mają osobne wartości dla każdej instancji klasy. Zmienne klas utrzymują jedną wspólną wartość dla wszystkich instancji klasy, nawet jeśli nie istnieje obiekt instancji tej klasy.
  • Użyłbyś słowa kluczowego static, aby zmienić zmienną instancji na zmienną klasy.
  • Zmienne instancji i klasy są zadeklarowane na poziomie klasy, a nie w obrębie metod.
Garg's
źródło
3

Różnica pomiędzy class variablesi instancezmienne, to po prostu kwestia who knows what?.

instance variableJest jedynym znanym (= związany ) z tym konkretny przykład - stąd jego nazwa.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

Definicja klasy przypomina plan budowy konkretnych obiektów. Być może ten punkt nieco Cię myli . Ale pisząc to w ten sposób, każda zmienna byłaby przypisana do konkretnego obiektu: np. Każda osoba ma swoje imię

Z class variabledrugiej strony - jak sama nazwa wskazuje - jest znana każdemu członkowi klasy; lub technicznie: jest znany / związany na poziomie klasy . Typowym przykładem jest licznik liczby obiektów, które utworzyłeś - chociaż jest to bardzo problematyczny przykład; ale to nie ma znaczenia na tym wczesnym etapie.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersonsjest zadeklarowane staticjako słowo kluczowe do rozróżnienia między class variablesi instance variabes. Zmienna jest zadeklarowana tak jak inne w definicji klasy. Ale staticsłowo kluczowe sygnalizuje, że jest inaczej.

  • firstName, lastNamezmiennymi instancji i są powiązane z tą konkretną instancją

  • numberOfPersons jest powiązany z klasą, aby każda instancja mogła uzyskać dostęp do tej zmiennej.

tl; dr

Miejscem definiowania zmiennych jest definicja klasy.

Zmienne klasy są znane na poziomie klasy / powiązane z poziomem klasy, tj. Każda konkretna instancja ma do niego dostęp. Aby zdefiniować zmienną klasową, użyj słowa kluczowego static.

Zmienne instancji są znane tylko na poziomie instancji. Zdefiniujesz je bez staticsłowa kluczowego.

Dalsza dokumentacja dla Java jest tutaj

Thomas Junk
źródło