Kelas Statis Di Jawa


947

Apakah ada yang seperti static classdi java?

Apa arti dari kelas semacam itu. Apakah semua metode dari kelas statis juga perlu static?

Apakah diperlukan sebaliknya, bahwa jika suatu kelas berisi semua metode statis, apakah kelas itu juga statis?

Untuk apa kelas statis itu bagus?



Kelas statis pada dasarnya digunakan untuk mengelompokkan kelas bersama.
RockingDev

Jawaban:


847

Java memiliki kelas bersarang statis tetapi sepertinya Anda mencari kelas statis tingkat atas. Java tidak memiliki cara untuk membuat kelas statis level atas tetapi Anda dapat mensimulasikan kelas statis seperti ini:

  • Deklarasikan kelas Anda final- Mencegah ekstensi kelas karena memperluas kelas statis tidak masuk akal
  • Make the constructor private- Mencegah instantiation dengan kode klien karena tidak masuk akal untuk membuat instance kelas statis
  • Jadikan semua anggota dan fungsi kelas static- Karena kelas tidak dapat dipakai, tidak ada metode instance yang bisa dipanggil atau bidang instance diakses
  • Perhatikan bahwa kompiler tidak akan mencegah Anda menyatakan anggota instance (non-statis). Masalah hanya akan muncul jika Anda mencoba memanggil anggota instan

Contoh sederhana per saran dari atas:

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

Apa bagusnya kelas statis? Penggunaan yang baik dari kelas statis adalah dalam mendefinisikan kelas satu kali, utilitas dan / atau perpustakaan di mana instantiasi tidak masuk akal. Contoh yang bagus adalah kelas Matematika yang berisi beberapa konstanta matematika seperti PI dan E dan hanya menyediakan perhitungan matematika. Membutuhkan instantiasi dalam kasus seperti itu tidak perlu dan membingungkan. Lihat Mathkelas dan kode sumber . Perhatikan bahwa itu adalah finaldan semua anggotanya static. Jika Java mengizinkan kelas tingkat atas untuk dideklarasikan staticmaka kelas Matematika memang akan statis.


35
kelas Foodengan staticmetode saja tidak sama denganstatic class Foo
craigb

12
@Evorlor: Jika suatu kelas dinyatakan final maka metodenya secara otomatis (efektif) final. Ini karena kelas akhir tidak dapat disubklasifikasikan, dan dengan demikian metodenya tidak dapat ditimpa (yaitu, secara efektif final). docs.oracle.com/javase/tutorial/java/IandI/final.html
jwayne

30
Jawaban ini mungkin membahas apa yang dimaksud OP, tetapi (saat ini) tidak menjelaskan kelas statis Java, dan karenanya tidak menjawab pertanyaan sama sekali! Ini sangat buruk bagi orang-orang yang datang ke sini mencoba mencari tahu apa artinya kelas statis di Jawa.
Tom

12
@JBoy: Ada yang namanya "kelas statis" di Jawa, yang merupakan pertanyaan, tapi jawaban ini sama sekali tidak menjelaskan. Alih-alih, ini menjelaskan bagaimana mensimulasikan di Jawa apa jawaban yang disebut "kelas statis" - tetapi yang bukan merupakan "kelas statis" di Jawa! (Mungkin itu yang disebut "kelas statis" dalam beberapa bahasa lain, tetapi orang-orang yang datang ke sini untuk belajar tentang kelas statis Java akan disesatkan dan bingung.)
Tom

4
Anda harus secara eksplisit menyebutkan bahwa private MyStaticClass () {// private constructor myStaticMember = 1; } tidak akan memiliki efek sama sekali karena konstruktor tidak akan dipanggil. Tapi ini bukan intinya. Saya masih sangat bingung tentang utilitas kelas dalam statis di Jawa dan utilitas mereka atau nilai tambah.
moldovean

316

Yah, Java memiliki "kelas bertingkat statis", tetapi mereka sama sekali tidak sama dengan kelas statis C #, jika dari sanalah Anda berasal. Kelas bersarang statis hanyalah salah satu yang tidak secara implisit memiliki referensi ke turunan dari kelas luar.

Kelas bersarang statis dapat memiliki metode instan dan metode statis.

Tidak ada yang namanya kelas statis tingkat atas di Jawa.


12
Di Jawa Mengapa kelas bersarang statis memungkinkan metode contoh? Apa gunanya metode instance di kelas seperti itu?
Geek

19
@ Geek: Apakah Anda membaca jawaban saya? Baca kalimat kedua dengan seksama. Mengapa Anda tidak ingin memiliki metode instan kelas statis? Anda dapat membuat contohnya.
Jon Skeet

17
@ Geek: Ya, sepenuhnya diizinkan. "Pemahaman" Anda bahwa kelas statis adalah kelas utilitas tidak benar, pada dasarnya. Bukan itu maksud kelas statis di Java sama sekali.
Jon Skeet

14
@ Geek: Ya. Persis seperti yang saya tulis dalam jawaban saya: "Kelas bersarang statis hanyalah salah satu yang tidak secara implisit memiliki referensi ke turunan dari kelas luar."
Jon Skeet

6
@ KhurramAli: Maksud Anda secara implisit ? Jelas tidak statis secara eksplisit , mengingat Anda tidak menggunakan kata kunci staticsaat mendeklarasikannya. Secara implisit statis karena Anda tidak perlu referensi ke hal lain untuk membangunnya. Secara pribadi saya menemukan terminologi statis / non-statis agak aneh untuk kelas bersarang ... Saya pikir akan lebih mudah untuk berbicara tentang apa perilakunya.
Jon Skeet

157

Ada kelas bersarang statis , kelas [statis bersarang] ini tidak memerlukan turunan dari kelas yang dilampirkan untuk dapat dipakai sendiri.

Kelas-kelas ini [yang bersarang statis] hanya dapat mengakses anggota statis dari kelas melampirkan [karena tidak memiliki referensi untuk contoh kelas melampirkan ...]

contoh kode:

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
Jadi bisakah kita mengatakan bahwa kita dapat menggunakan kelas statis dalam untuk membuat instance mereka tanpa perlu mempublikasikannya?
moldovean

@moldovean Kami menggunakan kelas statis dalam untuk membuat instance mereka dari konteks statis (seperti utama). Saya tidak berpikir itu ada hubungannya dengan visibilitas.
Michael Dorst

2
@moldovean static / non static adalah orthogonal untuk visibilitas. Anda dapat memiliki segala jenis visibilitas dengan statis atau non statis. Intinya adalah, apakah Anda memerlukan turunan dari kelas penutup, untuk membuat kelas batin?
amit

103

Ya ada kelas bersarang statis di java. Ketika Anda mendeklarasikan static class bersarang, itu secara otomatis menjadi kelas yang berdiri sendiri yang dapat dipakai tanpa harus instantiate kelas luar miliknya.

Contoh:

public class A
{

 public static class B
 {
 }
}

Karena class Bdinyatakan statis Anda dapat secara eksplisit memberi contoh sebagai:

B b = new B();

Catatan jika class Btidak dinyatakan statis untuk membuatnya berdiri sendiri, panggilan objek instan akan terlihat seperti ini:

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

7
Perhatikan bahwa Anda dapat instantiate kelas un-statis secara teratur seperti B b = new B();jika Anda mencoba untuk instantiate dari kelas Aitu sendiri.
Muhammed Refaat

33

Apa yang terjadi ketika anggota di dalam classdinyatakan sebagai static..? Anggota itu dapat diakses tanpa membuat instance class. Karena itu membuat kelas luar (kelas tingkat atas) statictidak ada artinya. Karena itu tidak diperbolehkan.

Tetapi Anda dapat mengatur kelas dalam sebagai statis (Karena itu adalah anggota kelas tingkat atas). Kemudian kelas itu dapat diakses tanpa membuat kelas tingkat atas. Perhatikan contoh berikut.

public class A {
    public static class B {

    }
}

Sekarang, di dalam kelas yang berbeda C, kelas Bdapat diakses tanpa membuat turunan kelas A.

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

statickelas dapat memiliki non-staticanggota juga. Hanya kelas yang statis.

Tetapi jika statickata kunci dihapus dari kelas B, itu tidak dapat diakses secara langsung tanpa membuat instance dari A.

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

Tetapi kita tidak dapat memiliki staticanggota di non-staticdalam kelas batin.


Bisakah kita instantiate kelas statis atau masuk akal?
Supun Wijerathne

6
Tidak seperti di bahasa lain, statichanya memiliki satu makna di java. Jika ada sesuatu staticdalam kelas itu berarti benda itu dapat diakses tanpa membuat instance kelas itu. Itu tidak mengatakan apa-apa tentang membuat instance atau tidak ..
Ramesh-X

Stackoverflow maaf! Saya tidak bisa menghindari mengucapkan Terima Kasih Ramesh-X dalam kasus ini! Anda membahas hampir semua yang saya bertanya-tanya tentang kelas batin statis dan kelas batin.
moldovean

Anda tidak dapat 'menetapkan kelas dalam sebagai statis'. Ini adalah kontradiksi dalam hal . Kelas bersarang adalah bagian dalam atau statis.
Marquis of Lorne

13

Melihat ini adalah hasil teratas di Google untuk "java kelas statis" dan jawaban terbaik tidak ada di sini saya pikir saya akan menambahkannya. Saya menafsirkan pertanyaan OP tentang kelas statis di C #, yang dikenal sebagai lajang di dunia Jawa. Bagi mereka yang tidak sadar, dalam C # kata kunci "statis" dapat diterapkan pada deklarasi kelas yang berarti kelas yang dihasilkan tidak akan pernah dapat dipakai.

Kutipan dari "Java Efektif - Edisi Kedua" oleh Joshua Bloch (secara luas dianggap sebagai salah satu panduan gaya Java terbaik yang tersedia):

Pada rilis 1.5, ada pendekatan ketiga untuk menerapkan lajang. Cukup buat tipe enum dengan satu elemen:

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

Pendekatan ini secara fungsional setara dengan pendekatan lapangan publik, kecuali bahwa itu lebih ringkas, menyediakan mesin serialisasi secara gratis, dan memberikan jaminan kuat terhadap berbagai instantiasi, bahkan dalam menghadapi serialisasi canggih atau serangan refleksi. Sementara pendekatan ini belum diadopsi secara luas, tipe enum elemen tunggal adalah cara terbaik untuk menerapkan singleton. (penulis penekanan)

Bloch, Joshua (2008-05-08). Java Efektif (Seri Java) (hlm. 18). Pendidikan Pearson.

Saya pikir implementasi dan pembenarannya cukup jelas.


6
Cara yang baik untuk menerapkan Singleton. Sayangnya, pertanyaannya bukan tentang Singletons, ini tentang kelas statis
David SN

1
Java memiliki interpretasi yang agak unik dari kata kunci "statis". Sepertinya OP berasal dari C # di mana "kelas statis" adalah setara dengan singleton di Jawa. Saya telah memperbarui jawaban saya untuk memperjelas interpretasi pertanyaan ini.
Bennet Huber

1
AC # static class bukan Singleton. Contoh Singleton adalah objek dan dapat mengimplementasikan antarmuka yang berarti dapat berpartisipasi dalam injeksi dependensi dan dapat diejek. AC # static class tidak dapat mengimplementasikan antarmuka atau disuntikkan dengan cara apa pun, dan jauh lebih dekat dengan sekelompok fungsi C, dan tentu saja memungkinkan metode ekstensi.
Novaterata

13

Bisakah kelas menjadi statis di Jawa?

Jawabannya adalah YA , kita dapat memiliki kelas statis di java. Di java, kami memiliki variabel instance statis serta metode statis dan juga blok statis . Kelas juga bisa dibuat statis di Jawa.

Di java, kita tidak bisa membuat kelas atas (luar) statis. Hanya kelas bersarang yang bisa statis.

kelas bertingkat statis vs kelas bertingkat non-statis

1) Kelas statis bersarang tidak memerlukan referensi kelas luar, tetapi kelas bertingkat non-statis atau kelas dalam membutuhkan referensi kelas luar.

2) Kelas dalam (atau kelas bertingkat non-statis) dapat mengakses anggota kelas luar statis dan non-statis. Kelas statis tidak dapat mengakses anggota non-statis kelas luar. Itu hanya dapat mengakses anggota statis kelas luar.

lihat di sini: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


juga kelas dalam 'non-statis' tidak dapat mendeklarasikan bidang atau metode statis
Mr.Cat


2

Secara sederhana, Java mendukung deklarasi sebuah kelas menjadi statis hanya untuk kelas dalam tetapi tidak untuk kelas tingkat atas.

kelas tingkat atas: Sebuah proyek java dapat berisi lebih dari satu kelas tingkat atas di setiap file sumber java, salah satu kelas diberi nama setelah nama file. Hanya ada tiga opsi atau kata kunci yang diizinkan di depan kelas tingkat atas, publik, abstrak, dan final .

Kelas dalam: kelas yang berada di dalam kelas tingkat atas disebut kelas dalam, yang pada dasarnya adalah konsep kelas bertingkat. Kelas batin bisa statis . Gagasan membuat kelas dalam statis, adalah untuk mengambil keuntungan dari instantiate objek kelas batin tanpa membuat instance objek dari kelas tingkat atas. Ini persis cara yang sama seperti metode dan variabel statis bekerja di dalam kelas tingkat atas.

Karenanya Java Mendukung Kelas Statis di Tingkat Kelas Dalam (di kelas bersarang)

Dan Java Tidak Mendukung Kelas Statis di Kelas Tingkat Atas.

Saya harap ini memberikan solusi yang lebih sederhana untuk pertanyaan untuk pemahaman dasar tentang kelas statis di Jawa.



0

Java memiliki metode statis yang dikaitkan dengan kelas (mis. Java.lang.Math hanya memiliki metode statis), tetapi kelas itu sendiri tidak statis.


0

Anda tidak dapat menggunakan kata kunci statis dengan kelas kecuali jika itu adalah kelas dalam. Kelas dalam statis adalah kelas bersarang yang merupakan anggota statis dari kelas luar. Itu dapat diakses tanpa membuat instance kelas luar, menggunakan anggota statis lainnya. Sama seperti anggota statis, kelas bersarang statis tidak memiliki akses ke variabel instan dan metode dari kelas luar.

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

Anda tidak dapat menggunakan statickata kunci dengan kelas kecuali jika itu adalah kelas bersarang . 'Static inner' adalah kontradiksi dalam istilah .
Marquis of Lorne

0

Metode statis berarti dapat diakses tanpa membuat objek kelas, tidak seperti publik:

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

Tidak menjawab pertanyaan.
Marquis of Lorne

-1

Semua jawaban yang baik, tetapi saya tidak melihat referensi ke java.util.Collections yang menggunakan banyak kelas dalam statis untuk metode faktor statis mereka. Jadi menambahkan hal yang sama.

Menambahkan contoh dari java.util.Collections yang memiliki beberapa kelas dalam statis. Kelas dalam berguna untuk mengelompokkan kode yang perlu diakses melalui kelas luar.

/**
 * @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();}
}

Berikut adalah metode faktor statis di kelas java.util.Collections

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


Tidak mendapat komentar Anda? Bisakah Anda menguraikan? Mencoba memahami komentar Anda.
Jay Rajput
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.