Java'daki Statik Sınıflar


947

Java'da böyle bir şey var mı static class?

Böyle bir sınıfın anlamı nedir. Statik sınıfın tüm yöntemlerinin de olması gerekiyor staticmu?

Diğer bir yol, bir sınıf tüm statik yöntemleri içeriyorsa, sınıfın da statik olması gerekir mi?

Statik sınıflar ne işe yarar?



Statik sınıflar temel olarak sınıfları birlikte gruplandırmak için kullanılır.
RockingDev

Yanıtlar:


847

Java'nın statik iç içe sınıfları vardır, ancak üst düzey bir statik sınıf aradığınız anlaşılıyor. Java'nın üst düzey bir sınıfı statik hale getirmenin bir yolu yoktur, ancak böyle bir statik sınıfı simüle edebilirsiniz:

  • Sınıfınızı beyan edin final- Statik bir sınıfı genişletmenin bir anlamı olmadığı için sınıfın genişletilmesini önler
  • Yapıcı yap private- Statik bir sınıfı başlatmanın bir anlamı olmadığı için istemci koduyla başlatmayı önler
  • Make bütün sınıfın üyeleri ve işlevleri staticsınıf hiçbir örnek yöntemler olarak adlandırılan veya örnek alanları ulaşılabilir başlatılamaz beri -
  • Derleyicinin bir örnek (statik olmayan) üye bildirmenizi engellemeyeceğini unutmayın. Sorun yalnızca örnek üyeyi aramaya çalışırsanız görünür

Yukarıdaki öneriler başına basit bir örnek:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

Statik sınıflar ne işe yarar? Statik sınıfın iyi bir kullanımı, örneklemenin anlamlı olmayacağı bir kerelik, yardımcı program ve / veya kütüphane sınıflarını tanımlamaktır. Harika bir örnek, PI ve E gibi bazı matematiksel sabitleri içeren ve sadece matematiksel hesaplamalar sağlayan Math sınıfıdır. Böyle bir durumda somutlaştırmayı gerekli ve kafa karıştırıcı olacaktır. Bkz Mathsınıf ve kaynak kodu . Dikkat edin finalve tüm üyeleri static. Java üst düzey sınıfların bildirilmesine izin verdiyse static, Math sınıfı gerçekten statik olur.


35
Foosadece staticyöntemleri olan bir sınıfla aynı değildirstatic class Foo
craigb

12
@Evorlor: Eğer bir sınıf final olarak ilan edilirse, yöntemleri otomatik olarak (etkin) final olur. Bunun nedeni, bir son sınıfın alt sınıflara ayrılamaması ve dolayısıyla yöntemlerinin geçersiz kılınamamasıdır (yani, etkin bir şekilde sonuncudur). docs.oracle.com/javase/tutorial/java/IandI/final.html
jwayne

30
Bu cevap belki OP'nin ne anlama geldiğini ele alır, ama şu anda Java statik sınıflarını açıklamamaktadır ve bu yüzden soruyu hiç cevaplamamaktadır! Buraya Java'da statik bir sınıfın ne anlama geldiğini anlamaya çalışan insanlar için bu çok kötü.
Tom

12
@JBoy: Java'da "statik sınıf" diye bir şey var, bu da sorunun ne olduğuyla ilgili, ancak bu cevap hiç açıklamıyor. Bunun yerine, Java'da cevabın "statik sınıf" olarak adlandırdığı şeyi nasıl simüle edeceğini açıklar - ancak Java'da "statik sınıf" bu değildir ! (Belki başka bir dilde "statik sınıf" olarak adlandırılan şeydir, ancak Java statik sınıflarını öğrenmek için buraya gelen insanlar yanlış yönlendirilir ve karıştırılır.)
Tom

4
özel MyStaticClass () {// özel kurucu myStaticMember = 1; } kurucu çağrılmayacağından hiçbir etkisi olmayacaktır. Ama mesele bu değil. Hala Java içindeki statik iç sınıfların yarar ve onların yarar veya katma değer hakkında çok karışık.
moldovean

315

Java'nın "statik içiçe sınıfları" vardır, ancak C # 'ın statik sınıflarıyla aynı değildirler, eğer o yerden geliyorsanız. Statik iç içe sınıf, dış sınıfın bir örneğine dolaylı olarak başvurusu olmayan bir sınıftır.

Statik iç içe sınıflar örnek yöntemleri ve statik yöntemlere sahip olabilir.

Java'da üst düzey statik sınıf diye bir şey yoktur.


12
Java'da Statik içiçe sınıf neden örnek yöntemlerine izin veriyor? Böyle bir sınıfta örnek yönteminin kullanımı nedir?
Geek

19
@Geek: Cevabımı okudun mu? İkinci cümleyi dikkatle okuyun. Neden olur değil statik sınıfların örnek yöntemlerine sahiptir edebilmek istiyor? Ne de olsa bunların örneklerini oluşturabilirsiniz.
Jon Skeet

17
@Geek: Evet, tamamen izin verilebilir. Statik sınıfların yardımcı program sınıfları olduğunu "anladığınız" temelde yanlıştır. Java'daki statik sınıfların anlamı bu değildir.
Jon Skeet

14
@Geek: Evet. Tam olarak cevabımda yazdığım gibi: "Statik iç içe bir sınıf, dış sınıfın bir örneğine dolaylı bir referansı olmayan sadece bir sınıftır."
Jon Skeet

6
@KhurramAli: Do Şunu dolaylı ? Onlar kesinlikle değiliz açıkça anahtar kelimesini kullanmayın göz önüne alındığında, statik staticbunları bildirirken. Örtük olarak statiktirler, çünkü bir tane inşa etmek için başka bir şeye başvurmanıza gerek yoktur. Şahsen ben statik / statik olmayan terminolojiyi iç içe dersler için biraz garip buluyorum ... Bence davranışların ne olduğu hakkında konuşmak daha kolay olurdu.
Jon Skeet

157

Statik iç içe bir sınıf vardır , bu [statik iç içe] sınıfın kendisini somutlaştırmak için çevreleyen sınıfın bir örneğine ihtiyacı yoktur.

Bu sınıflar [statik içiçe olanlar] yalnızca çevreleyen sınıfın statik üyelerine erişebilir [çünkü çevreleyen sınıfın örnekleri için herhangi bir referansı yoktur ...]

kod örneği:

public class Test { 
  class A { } 
  static class B { }
  public static void main(String[] args) { 
    /*will fail - compilation error, you need an instance of Test to instantiate A*/
    A a = new A(); 
    /*will compile successfully, not instance of Test is needed to instantiate B */
    B b = new B(); 
  }
}

1
Öyleyse iç statik sınıfları onları halka açmaya gerek kalmadan somutlaştırmak için kullanabileceğimizi söyleyebilir miyiz?
moldovean

@moldovean İç statik sınıfları, statik bir bağlamdan (main gibi) somutlaştırmak için kullanırız . Görünürlükle ilgisi olduğunu düşünmüyorum.
Michael Dorst

2
@moldovean statik / statik olmayan görünürlük için diktir. Statik veya statik olmayan herhangi bir görünürlük elde edebilirsiniz. Mesele şu ki, iç olanı oluşturmak için ek sınıfın bir örneğine ihtiyacınız var mı?
amit

103

Evet, Java'da statik iç içe bir sınıf var. Yuvalanmış bir sınıf statiki bildirdiğinizde, otomatik olarak ait olduğu dış sınıfı somutlaştırmak zorunda kalmadan somutlaştırılabilen bağımsız bir sınıf haline gelir.

Misal:

public class A
{

 public static class B
 {
 }
}

Çünkü class Baçıkça örneğini olarak can statik ilan edilir:

B b = new B();

Not eğer class Btek başına çarpması için statik beyan edilmedi, bir örnek nesne çağrısı bu gibi gözükebilir:

A a= new A();
B b = a.new B();

7
statik olmayan sınıfı düzenli olarak sınıfın kendisinden B b = new B();başlatmaya çalıştığınız gibi başlatabileceğinizi unutmayın A.
Muhammed Refaat

33

A içindeki üyeler classolarak ilan edildiğinde ne oluyor static..? Bu üyelere class,. Bu nedenle dış sınıf (üst düzey sınıf) yapmanın bir staticanlamı yoktur. Bu nedenle izin verilmez.

Ancak iç sınıfları statik olarak ayarlayabilirsiniz (Üst düzey sınıfın bir üyesi olduğu için). Daha sonra bu sınıfa, üst düzey sınıfı somutlaştırmadan erişilebilir. Aşağıdaki örneği ele alalım.

public class A {
    public static class B {

    }
}

Şimdi, farklı bir sınıfın içinde C, sınıfa Bbir örnek oluşturmadan erişilebilir A.

public class C {
    A.B ab = new A.B();
}

staticsınıfların da non-staticüyeleri olabilir . Sadece sınıf statik olur.

Ancak, staticanahtar kelime sınıftan kaldırılırsa, Bbir örneği olmadan doğrudan erişilemez A.

public class C {
    A a = new A();
    A.B ab = a. new B();
}

Fakat iç sınıfta staticüyemiz olamaz non-static.


Statik bir sınıf başlatabilir miyiz yoksa anlamlı mı?
Supun Wijerathne

6
Diğer dillerde olduğu gibi static, java da sadece bir anlamı vardır. staticBir sınıfta bir şey varsa, o sınıfın örneğini oluşturmadan o şeye erişilebileceği anlamına gelir. Örnek oluşturma veya oluşturma konusunda hiçbir şey söylemez ..
Ramesh-X

Üzgünüm stackoverflow! Bu durumda Teşekkürler Ramesh-X demekten kaçınamam! Statik iç sınıflar ve iç sınıflar hakkında merak ettiğim neredeyse her şeyi kapsadınız.
moldovean

'İç sınıfları statik olarak ayarlayamazsınız'. Bu bir çelişki . Yuvalanmış bir sınıf iç veya statiktir.
user207421

13

Bunun Google'da "statik sınıf java" için en iyi sonuç olduğunu ve en iyi yanıtın burada olmadığını düşündüm. OP'nin sorusunu Java dünyasında singleton olarak bilinen C # 'daki statik sınıflarla ilgili olarak yorumluyorum. Farkında olmayanlar için, C # 'da "statik" anahtar sözcüğü bir sınıf bildirimine uygulanabilir, bu da sonuçta ortaya çıkan sınıfın hiçbir zaman başlatılamayacağı anlamına gelir.

Joshua Bloch'un "Etkili Java - İkinci Baskı" bölümünden alıntı (yaygın olarak mevcut en iyi Java tarzı kılavuzlarından biri olarak kabul edilir):

1.5 sürümünden itibaren, singletonların uygulanması için üçüncü bir yaklaşım vardır. Tek bir elemanla bir numaralandırma türü yapın:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

Bu yaklaşım, kamusal alan yaklaşımıyla işlevsel olarak eşdeğerdir, ancak daha özlü olması, serileştirme makinelerini ücretsiz olarak sağlaması ve sofistike serileştirme veya yansıma saldırıları karşısında bile çoklu somutlaşmaya karşı zırhlı bir garanti sağlar. Bu yaklaşım henüz geniş çapta benimsenmese de, tek elemanlı bir enum tipi bir singletonu uygulamanın en iyi yoludur. (vurgu yazarının)

Bloch, Joshua (2008-05-08). Etkili Java (Java Serisi) (s.18). Pearson Eğitim.

Bence uygulama ve gerekçe oldukça açıklayıcı.


6
Bir Singleton uygulamak için iyi bir yol. Ne yazık ki, soru Singletons hakkında değil, statik sınıflarla ilgili
David SN

1
Java, "statik" anahtar kelimeyi benzersiz bir şekilde yorumlamaktadır. OP, "statik sınıf" ın Java'daki bir singleton eşdeğeri olduğu C # 'dan geliyor gibi görünüyor. Sorunun bu yorumunu netleştirmek için cevabımı güncelledim.
Bennet Huber

1
AC # statik sınıfı bir Singleton değil. Singleton örneği bir nesnedir ve bağımlılık enjeksiyonuna katılabileceği ve alay edilebileceği anlamına gelen bir arabirim uygulayabilir. AC # statik sınıf bir arabirimi uygulayamaz veya herhangi bir şekilde enjekte edilemez ve sadece bir grup C işlevine çok daha yakındır ve elbette genişletme yöntemlerine izin verir.
Novaterata

13

Java'da bir sınıf statik olabilir mi?

Cevap EVET , java'da statik sınıfımız olabilir. Java'da statik örnek değişkenlerin yanı sıra statik yöntemler ve statik blok var . Sınıflar ayrıca Java'da statik hale getirilebilir.

Java'da Üst düzey (dış) sınıfı statik yapamayız. Yalnızca iç içe sınıflar statik olabilir.

statik iç içe sınıf vs statik olmayan iç içe sınıf

1) İç içe statik sınıfın Dış sınıf başvurusuna ihtiyacı yoktur, ancak Statik olmayan iç içe sınıf veya İç sınıf Dış sınıf başvurusunu gerektirir.

2) İç sınıf (veya statik olmayan iç içe sınıf) Dış sınıfın hem statik hem de statik olmayan üyelerine erişebilir. Statik bir sınıf, Outer sınıfının statik olmayan üyelerine erişemez. Outer sınıfının yalnızca statik üyelerine erişebilir.

buraya bakın: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


ayrıca iç 'statik olmayan' sınıflar statik alanlar veya yöntemler
bildiremez


2

Basit bir ifadeyle Java, bir sınıfın bildiriminin yalnızca iç sınıflar için statik olduğunu, ancak üst düzey sınıflar için statik olmadığını bildirir.

üst düzey sınıflar: Bir java projesi, her bir java kaynak dosyasında birden çok üst düzey sınıf içerebilir; bu sınıflardan biri dosya adından sonra adlandırılır. Üst düzey sınıfların önünde herkese açık, soyut ve final olmak üzere yalnızca üç seçenek veya anahtar kelimeye izin verilir.

İç sınıflar: üst düzey sınıfın içindeki sınıflara iç sınıflar denir, temel olarak iç içe sınıf kavramı. İç sınıflar statik olabilir . İç sınıfları statik hale getirme fikri, üst sınıf sınıfının nesnesini somutlaştırmadan iç sınıfların nesnelerini somutlaştırma avantajından yararlanmaktır. Bu, statik yöntemlerin ve değişkenlerin bir üst düzey sınıf içinde çalıştığı yöntemle tamamen aynıdır.

Bu nedenle Java, İç Sınıf Düzeyinde Statik Sınıfları Destekler (iç içe sınıflarda)

Ve Java Üst Düzey Sınıflarda Statik Sınıfları Desteklemez.

Umarım bu, Java'daki statik sınıfların temel olarak anlaşılması sorusuna daha basit bir çözüm sağlar.



0

Java'nın sınıflarla ilişkili statik yöntemleri vardır (örn. Java.lang.Math yalnızca statik yöntemlere sahiptir), ancak sınıfın kendisi statik değildir.


0

Statik anahtar sözcüğü, bir iç sınıf olmadığı sürece bir sınıfla birlikte kullanılamaz. Statik iç sınıf, dış sınıfın statik bir üyesi olan iç içe bir sınıftır. Diğer statik elemanlar kullanılarak dış sınıfı somutlaştırmadan erişilebilir. Statik üyeler gibi, statik iç içe bir sınıfın da dış sınıfın örnek değişkenlerine ve yöntemlerine erişimi yoktur.

public class Outer {
   static class Nested_Demo {
      public void my_method() {
          System.out.println("This is my nested class");
      }
   }
public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();
      nested.my_method();
   }
}

Sen kullanamazsınız staticbir sürece bir sınıfla anahtar kelimeyi iç içe sınıfı. 'Statik iç', bir çelişki .
user207421

0

Statik bir yöntem, genelin aksine, sınıfın bir nesnesini oluşturmadan erişilebileceği anlamına gelir:

public class MyClass {
   // Static method
   static void myStaticMethod() {
      System.out.println("Static methods can be called without creating objects");
   }

  // Public method
  public void myPublicMethod() {
      System.out.println("Public methods must be called by creating objects");
   }

  // Main method
  public static void main(String[ ] args) {
      myStaticMethod(); // Call the static method
    // myPublicMethod(); This would output an error

    MyClass myObj = new MyClass(); // Create an object of MyClass
    myObj.myPublicMethod(); // Call the public method
  }
}

Soruya cevap vermiyor.
user207421

-1

Tüm iyi cevaplar, ama statik faktör yöntemleri için tonlarca statik iç sınıf kullanan java.util.Collections bir referans görmedim. Aynı şeyi eklemek.

Birden fazla statik iç sınıfa sahip java.util.Collections öğesinden bir örnek ekleme. İç sınıflar, dış sınıf üzerinden erişilmesi gereken kodu gruplamak için kullanışlıdır.

/**
 * @serial include
 */
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                             implements Set<E>, Serializable {
    private static final long serialVersionUID = -9215047833775013803L;

    UnmodifiableSet(Set<? extends E> s)     {super(s);}
    public boolean equals(Object o) {return o == this || c.equals(o);}
    public int hashCode()           {return c.hashCode();}
}

Java.util.Collections sınıfındaki statik faktör yöntemi

public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
    return new UnmodifiableSet<>(s);
}


Yorumunuz yok mu? Detaylandırabilir misin? Yorumunuzu anlamaya çalışıyorum.
Jay Rajput
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.