Java'daki sınıf değişkenleri ile örnek değişkenler arasındaki farklar nelerdir? [kapalı]


16

Java için çok yeniyim ve sınıf değişkenleri ile örnek değişkenler arasındaki farkı anlamak istiyorum.

Örneğin:

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

Örnek değişkenler ve sınıf değişkenleri birbirinden nasıl farklıdır? Buradaki hangi değişkenler sınıf değişkenidir ve hangileri örnek değişkenlerdir? Bu kapsamı nasıl etkiler?


1
Bunu açıklayan, ancak tam olarak anlamayan Java ™ Tutorials: Class Üyelerini Anlama başlamış gibi görünüyorsunuz .

Yanıtlar:


35

Her ikisi de üye değişkenleridir, yani her ikisi de bir sınıfla ilişkilidir. Şimdi elbette, ikisi arasında farklılıklar var:

Örnek değişkenler:

Bu değişkenler bir sınıfın örneğine , dolayısıyla bir nesneye aittir . Ve o sınıfın (nesnenin) her örneğinin bu değişkenin kendi kopyası vardır. Değişkende yapılan değişiklikler o sınıfın diğer örneklerini yansıtmaz.

public class Product {
    public int Barcode;
}

Sınıf değişkenleri:

Bunlar statik üye değişkenler olarak da bilinir ve bu değişkenin o sınıfın tüm örnekleriyle paylaşılan yalnızca bir kopyası vardır. Bu değişken üzerinde değişiklik yapılırsa, diğer tüm örnekler değişikliklerin etkisini görür.

public class Product {
    public static int Barcode;
}

Tam örnek:

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

Çıktı şöyle olacaktır:

123456

987654

Şimdi, example değişkenini statik hale getirerek bir sınıf değişkenine değiştirin:

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

Sınıftan Barcodedeğil, nesneden çağırabilme değerini almak ve ayarlamak için statik olmayan yöntemler kullandım . Çıktı aşağıdaki gibi olacaktır:

987654

987654


Java sorusu için neden bir C # örneği?
Basile Starynkevitch

Tam olarak düşüncelerim.Java programlama C # değil sadece biliyorum, bu yüzden çok yardımcı olmadı
Skylar Adams

1
@BasileStarynkevitch Ben esas olarak bir C # geliştiricisiyim ve prensip her ikisi için de geçerli olduğundan ve aynı derecede iyi olduğundan, hızlı bir şekilde C # örneğini sağladım, tabii ki yanlış. :) Örneğimi Java olarak değiştirdim.
Abbas

2
@SkylarAdams Maalesef, Java'yı bilen herkesin C # bildiğini çok çabuk yanlış varsaydım. Örneği Java ile değiştirdim, umarım yardımcı olur.
Abbas

9
Bu tür bir soru için, Java veya C # kullanarak, bunun alakasız olduğunu düşünüyorum
Thomas Junk

6

Bu açıklanmıştır burada (bir örnek ile Bicyclesınıf değişkeni ile sınıf numberOfBicyclesve örnek değişkenler cadence, speed, gearve id):

Bazen, tüm nesneler için ortak olan değişkenlere sahip olmak istersiniz. Bu, staticdeğiştirici ile gerçekleştirilir . staticBildirimlerinde değiştiriciye sahip alanlara statik alanlar veya sınıf değişkenleri denir. Herhangi bir nesne ile değil sınıfla ilişkilendirilirler. Sınıfın her örneği, bellekte sabit bir konumda bulunan bir sınıf değişkenini paylaşır. Herhangi bir nesne bir sınıf değişkeninin değerini değiştirebilir, ancak sınıf değişkenleri sınıfın bir örneği oluşturmadan da değiştirilebilir.

Sınıf değişkeni (bildirilen static) tüm örnekler için ortak bir konumdur.

Örnekte, numberOfBicyclesbir sınıf değişkeni (bildirildiğinden beri static). Tüm örnekler ve sınıf için ortak olan sadece bir değişken (yani konum) vardır. Dolayısıyla numberOfBicycles, bir yöntemde değişiklik yaparsanız , diğer yöntemler yeni değeri görür (farklı Bicyclenesneler için bile )

Bunun aksine gearve idvardır , örneğin değişkenleri (kendi bildirimi bir çünkü staticdeğiştirici). Her Bicyclenesnenin kendi nesnesi vardır. gearBazı Bicycle a için değiştirirseniz ve b başka bir örnekse, değiştirmenin a.gearherhangi bir etkisi olmazb.gear

Her Java nesnesi, bazı meta verileri (örneğin, sınıfına bir referans) ve kendi örnek değişkenlerine (belki de bir üst sınıftan devralınan) sahip ayrı bir bellek bölgesidir. Ancak sınıf değişkenleri sınıf için ortaktır ve tüm örnekler tarafından paylaşılır.

Ayrıca bkz. Nesne (bilgisayar bilimi) ve Örnek değişken wikipages.


4

Örnek değişkeni:

  • Örnek değişkenleri bir sınıfta, ancak bir yöntem, yapıcı veya herhangi bir blok dışında bildirilir.
  • Örnek değişkeni bir sınıf örneğine aittir veya örnek değişkeninin nesneye ait olduğunu söyleyebilirsiniz.
  • Örnek değişkeni, sınıfın her bir örneğinin ayrı değerine sahiptir.

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

Örnek değişkenine erişim yöntemi:

InstanceDemo demo = new InstanceDemo ();

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

Çıkış: 2, Test

Sınıf Değişkeni:

  • Sınıf değişkeni sınıfa aittir.
  • class değişkeni, değişkenin önüne “static” anahtar sözcüğü eklenerek oluşturulur.
  • Statik değişken de denir.
  • Ve en önemli sınıf değişkeni, sınıfın örnek nesnesi olmasa bile, sınıfın tüm örneği için tek bir paylaşılan değeri korur.

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

Sınıf değişkenine erişim yöntemi:

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

Çıktı: 2

Sınıf Değişkeni ile Örnek Değişkeni Arasındaki Kısa Fark:

  • Örnek değişkenleri, bir sınıfın her örneği için ayrı değerlere sahiptir. Sınıf değişkenleri, söz konusu sınıfın örnek nesnesi olmasa bile, sınıfın tüm örnekleri için tek bir paylaşılan değeri korur.
  • Bir örnek değişkenini bir sınıf değişkenine değiştirmek için static anahtar sözcüğünü kullanırsınız.
  • Hem örnek hem de sınıf değişkenleri, yöntemler dahilinde değil, sınıf düzeyinde bildirilir.

3

Arasındaki fark class variablesve instancedeğişkenler, sadece bir sorudur who knows what?.

An instance variableyalnızca somut örnekle bilinir (= bağlı ) - dolayısıyla adı.

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

Bir sınıfın tanımı, somut nesneler inşa etmek için bir taslak gibidir . Belki de bu nokta sizi biraz karıştırıyor . Ancak bu şekilde yazıldığında, her değişken kendi somut nesnesine bağlı olacaktır: örneğin, her insanın kendi adı vardır

A class variableise - adından da anlaşılacağı gibi - bir sınıfın her üyesi tarafından bilinir; veya teknik olarak: Sınıf düzeyinde bilinir / sınırlandırılır . Tipik örnek, kaç tane nesne yarattığınızın bir sayacıdır - çok sorunlu bir örnek olmasına rağmen; ama bu erken aşamada bu önemli değil.

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

numberOfPersonsve staticarasında ayrım yapmak için anahtar kelime olan ilan edilir . Değişken, sınıf tanımındaki diğerleri gibi bildirilir. Ama anahtar kelime farklı olduğunu işaret ediyor.class variablesinstance variabesstatic

  • firstName, lastNameOlan , örnek değişkenler ve somut örneğine bağlı

  • numberOfPersons sınıfa bağlıdır, böylece her örnek bu değişkene erişebilir.

tl; Dr.

Değişkenlerin tanımlandığı yer sınıf tanımıdır.

Sınıf değişkenleri sınıf düzeyinde bilinir / sınırlıdır, yani her somut örneğin buna erişimi vardır. Bir sınıf değişkeni tanımlamak için anahtar kelimeyi kullanırsınız static.

Örnek değişkenleri yalnızca örnek düzeyinde bilinir. Bunları staticanahtar kelime olmadan tanımlarsınız .

Java ile ilgili diğer belgeler burada

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.