CodeGym /Java Blogu /Rastgele /Java'daki statik değiştirici hakkında bilmeniz gereken 10...
John Squirrels
Seviye
San Francisco

Java'daki statik değiştirici hakkında bilmeniz gereken 10 şey

grupta yayınlandı
Java'da statik değiştirici, bir şeyin doğrudan bir sınıfla ilgili olduğu anlamına gelir: eğer bir alan statikse, o zaman sınıfa aittir; bir yöntem statik ise, o zaman sınıfa aittir. Sonuç olarak, statik bir yöntemi çağırmak veya statik bir alana başvurmak için sınıfın adını kullanabilirsiniz. Örneğin, countalanın sınıfta statik olması Counter, değişkene aşağıdaki ifadeyle başvurabileceğiniz anlamına gelir: Counter.count. Java'daki statik değiştirici hakkında bilmeniz gereken 10 şey - 1Elbette, erişim değiştiricileri dikkate alınmalıdır. Örneğin, privatealanlar yalnızca tanımlandıkları sınıf içinde kullanılabilir. Alanlar protected, bir paket içindeki tüm sınıfların yanı sıra paket dışındaki tüm alt sınıfları tarafından kullanılabilir. Sınıfın , işi değeri artırmak olan Counterstatik bir yöntemi olduğunu varsayalım.increment()countalan. Bu yöntemi çağırmak için kullanabilirsiniz Counter.increment(). CounterStatik bir alana veya yönteme erişmek için sınıfın bir örneğini oluşturmaya gerek yoktur . Statik (sınıf) değişkenler ve yöntemler ile statik OLMAYAN (örnek) değişkenler ve yöntemler arasındaki temel fark budur. Önemli bir not. Sınıfın statik üyelerinin, sınıfın herhangi bir örneğine değil, doğrudan sınıfa ait olduğunu unutmayın. Yani statik değişkenin değeri counttüm nesneler için aynı olacaktır Counter. Bu makalede, Java'da statik değiştiriciyi kullanmanın temel yönlerinin yanı sıra temel programlama kavramlarını anlamanıza yardımcı olacak bazı özelliklere bakacağız.

Her programcının Java'daki statik değiştirici hakkında bilmesi gerekenler.

Bu bölümde, statik yöntemleri, alanları ve sınıfları kullanmanın ana yönlerine bakıyoruz. Değişkenlerle başlayalım.
  1. Statik bir yöntem veya blok gibi statik bir bağlamda bir sınıfın statik olmayan üyelerine ERİŞEMEZSİNİZ. Aşağıdaki kodu derlemek bir hataya neden olur:

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    Bu, özellikle yeni başlayanlar olmak üzere Java programcıları tarafından yapılan en yaygın hatalardan biridir. Yöntem mainstatik olduğundan ve countdeğişken olmadığından, printlnyöntemin yöntem içinde kullanılması mainbir "derleme zamanı hatası" üretecektir.

  2. thread safeYerel değişkenlerin aksine, statik alanlar ve yöntemler Java'da DEĞİLDİR . Pratikte bu, çok iş parçacıklı programlamadaki güvenlik sorunlarının en yaygın nedenlerinden biridir. Bir sınıfın her örneğinin bir statik değişkenin aynı kopyasına başvurduğu düşünülürse, böyle bir değişkenin sınıf tarafından korunması veya "kilitlenmesi" gerekir. synchronizedBu nedenle, statik değişkenleri kullanırken, gibi sorunlardan kaçınmak için doğru olduklarından emin olun race conditions.

  3. Statik yöntemlerin pratik bir avantajı vardır, çünkü onları her çağırmak istediğinizde yeni bir nesne oluşturmaya gerek yoktur. Statik bir yöntem, onu bildiren sınıfın adı kullanılarak çağrılabilir. factoryBu nedenle bu yöntemler, yöntemler ve utilityyöntemler için mükemmeldir . Sınıf java.lang.Mathharika bir örnektir: neredeyse tüm yöntemleri statiktir. Java'nın yardımcı program sınıfları da finalaynı nedenle işaretlenir.

  4. @OverrideBir diğer önemli nokta ise ( ) statik metotları geçersiz kılamazsınız . subclassBöyle bir yöntemi a'da , yani aynı ada ve imzaya sahip bir yöntemde bildirirseniz , the yöntemini superclassgeçersiz kılmak yerine yalnızca "gizlersiniz". Bu fenomen olarak bilinir method hiding. Bu, hem üst hem de alt sınıflarda statik bir yöntem bildirilirse, çağrılan yöntemin her zaman derleme zamanındaki değişken türüne dayalı olacağı anlamına gelir. Yöntem geçersiz kılmanın aksine, bu tür yöntemler program çalışırken yürütülmez. Bir örnek ele alalım:

    
    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         } 
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         } 
    }
    
    public class Demo {   
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }
    

    Konsol çıktısı:

    Üst sınıf/statik yöntem içinde

    Kod, nesnenin a olmasına rağmen Carsınıftaki statik yöntemin Vehicleçağrıldığını, çünkü yöntem derleme zamanında çağrıldığını açıkça göstermektedir. Ve hiçbir derleme hatası olmadığına dikkat edin!

  5. Üstelik, üst düzey sınıflar dışında, sınıfları statik olarak ilan edebilirsiniz. Bu tür sınıflar olarak bilinir nested static classes. Daha iyi uyum sağlamak için kullanışlıdırlar. İç içe bir statik sınıfın çarpıcı bir örneği HashMap.Entry, içinde bir veri yapısı olan HashMap. İç sınıflar gibi statik iç içe sınıfların ayrı bir .class dosyasında bildirildiğini belirtmekte fayda var. Böylece, ana sınıfınızda iç içe beş sınıf bildirirseniz, .class uzantılı 6 dosyanız olur. Başka bir örnek, sınıftaki Comparatorbir yaş karşılaştırıcısı ( ) gibi kendi bildirimimizdir .AgeComparatorEmployee

  6. Statik değiştirici, sınıf yüklendiğinde yürütülen, daha çok "statik başlatma bloğu" olarak bilinen statik bir blokta da belirtilebilir. Böyle bir blok bildirmezseniz, Java tüm statik alanları tek bir listede toplar ve sınıf yüklendiğinde bunları başlatır. Statik bir blok, kontrol edilen istisnaları atamaz, ancak kontrol edilmeyen istisnaları atabilir. Bu durumda bir durum ExceptionInInitializerErroroluşacaktır. Uygulamada, statik alanların başlatılması sırasında meydana gelen herhangi bir istisna, Java tarafından bu hataya sarılır. NoClassDefFoundErrorBu aynı zamanda , sınıfın başvurulduğu zaman bellekte olmayacağı için en yaygın nedenidir .

  7. Gerçek bir nesne üzerinde çağrıldığında çalışma zamanında bağlanan sanal veya statik olmayan yöntemlerin bağlanmasından farklı olarak, statik yöntemlerin derleme zamanında bağlandığını bilmek yararlıdır. Buna göre, Java'da statik yöntemler geçersiz kılınamaz, çünkü çalışma zamanında çok biçimlilik onlar için geçerli değildir. Bu, statik bir yöntem bildirirken dikkate alınması gereken önemli bir sınırlamadır. Bunu yapmak, yalnızca bir alt sınıfta yöntemi geçersiz kılma yeteneği veya ihtiyacı olmadığında anlamlıdır. Fabrika yöntemleri ve yardımcı yöntemler, statik değiştiricinin doğru kullanımına iyi örneklerdir. Joshua Bloch, her Java programcısı için zorunlu okuma olan Etkili Java adlı kitabında statik fabrika yöntemlerinin kuruculara göre sahip olduğu çeşitli avantajlara dikkat çekiyor.

  8. Başlatma, statik bir bloğun önemli bir yönüdür. Statik alanlar veya değişkenler, sınıf belleğe yüklendikten sonra başlatılır. Başlatma sırası, Java sınıfının kaynak dosyasında bildirildikleri sırayla yukarıdan aşağıya doğrudur. Statik alanlar iş parçacığı açısından güvenli bir şekilde başlatıldığından, bu işlem aynı zamanda Singletondeseni uygulamak için de kullanılır. EnumHerhangi bir nedenle an kullanmıyorsanız Singleton, iyi bir alternatifiniz var demektir. Ancak bu durumda, bunun "tembel" bir başlatma olmadığını dikkate almalısınız. Bu, statik alanın birisi "sormadan" ÖNCE bile başlatılacağı anlamına gelir. Bir nesne kaynak ağırlıklıysa veya nadiren kullanılıyorsa, onu statik bir blokta başlatmak sizin lehinize çalışmaz.

  9. Serileştirme sırasında değişkenler gibi statik alanlar transientserileştirilmez. Aslında, herhangi bir veriyi statik bir alana kaydederseniz, seri durumdan çıkarmadan sonraki ilk (varsayılan) değerini içerecektir. Örneğin, bir statik alan bir ise int, seriden çıkarmadan sonra değeri sıfır olur. Türü ise float, değer 0.0 olacaktır. Alan bir ise Object, değer olacaktır null. Dürüst olmak gerekirse, bu, Java pozisyonları için yapılan görüşmelerde serileştirme hakkında en sık sorulan sorulardan biridir. Temel nesne verilerini statik bir alanda saklamayın!

  10. Son olarak, statik içe aktarma hakkında konuşalım. Bu değiştiricinin standart deyimle pek çok ortak noktası vardır import, ancak statik sınıf üyelerinden birini veya tümünü içe aktarmanıza izin vermesi bakımından farklıdır. Statik metotlar içe aktarıldıktan sonra, aynı sınıfta bildirilmiş gibi erişilebilirler. Benzer şekilde, statik alanları içe aktararak, sınıf adını belirtmeden bunlara erişebiliriz. Bu özellik Java 1.5'te ortaya çıktı ve doğru kullanıldığında kodun okunabilirliğini artırıyor. Bu yapı en çok JUnit testlerinde bulunur, çünkü neredeyse tüm test geliştiricileri, iddia yöntemleri, örneğin assertEquals()ve bunların aşırı yüklenmiş değişkenleri için statik içe aktarmayı kullanır.

  11. Şimdilik bu kadar. Her Java programcısının yukarıda belirtilen statik değiştiricinin tüm özelliklerini bilmesi gerekir. Bu makale, statik değişkenler, alanlar, yöntemler, başlatma blokları ve içe aktarmalar hakkında temel bilgileri gözden geçirdi. Java programlarını yazmak ve anlamak için bilinmesi gereken bazı önemli özelliklere de değinildi. Umarım her geliştirici, statik üyeleri ustalıkla kullanır, çünkü bu, ciddi yazılım geliştirme için çok önemlidir."

Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION