Rumah  >  Artikel  >  Java  >  Kelas Dalaman Java dan Kelas Bersarang

Kelas Dalaman Java dan Kelas Bersarang

Susan Sarandon
Susan Sarandonasal
2024-10-27 12:21:30325semak imbas

Di Java, kelas dalam hanyalah kelas yang ditakrifkan dalam kelas atau antara muka lain. Kelas dalaman membantu mengekalkan kod yang berkaitan bersama-sama, menjadikan program lebih mudah dibaca dan difahami. Mereka juga membenarkan kelas dalaman mengakses ahli peribadi kelas luar, menjadikannya lebih mudah untuk mengatur dan melindungi kod. Dalam artikel ini, kami akan meneroka asas kelas dalaman dan bersarang di Java.

Java Inner Classes and Nested Classes

Mengapa Menggunakan Kelas Dalaman?

Kelas dalaman Java telah diperkenalkan untuk mengendalikan senario di mana satu set kelas secara logik tergolong bersama tetapi tidak perlu diakses di luar kelas yang mengandunginya. Dengan mentakrifkan kelas dalam dalam kelas luar, pembangun Java boleh meningkatkan kebolehbacaan kod, meningkatkan modulariti dan mengakses ahli persendirian kelas luar, mencapai struktur yang lebih terkapsul, seperti dunia nyata dalam pengaturcaraan berorientasikan objek.

Kelebihan Menggunakan Kelas Dalaman:

  1. Kod Lebih Bersih: Kelas dalaman membenarkan struktur kod yang diperkemas dengan mengumpulkan kelas dan antara muka yang berkaitan dalam satu skop.
  2. Encapsulation: Kelas dalaman boleh mengakses ahli persendirian kelas luar, memberikan struktur kod terkapsul yang lebih selamat.
  3. Pengoptimuman Kod: Kurang kod diperlukan untuk menentukan fungsi yang berkait rapat antara satu sama lain.
  4. Pengendalian Acara: Kelas dalaman sering digunakan dalam pengaturcaraan dipacu acara Java, terutamanya untuk melaksanakan panggilan balik dan pendengar acara dalam aplikasi GUI.

Jenis Kelas Dalaman dan Bersarang

Java membahagikan kelas bersarang kepada dua kategori luas: kelas bersarang bukan statik (biasanya dirujuk sebagai kelas dalam) dan kelas bersarang statik. Dalam kategori ini, empat jenis kelas dalaman yang berbeza tersedia, masing-masing dengan ciri unik:

  1. Kelas Dalaman Ahli
  2. Kaedah Kelas Dalaman Tempatan
  3. Kelas Bersarang Statik
  4. Kelas Dalaman Tanpa Nama

Mari kita terokai setiap jenis dengan contoh untuk memahami perbezaannya dan kes penggunaan tertentu.

1. Kelas Dalaman Ahli

kelas dalaman ahli ialah kelas bukan statik yang ditakrifkan secara langsung dalam kelas luar. Kelas dalaman jenis ini boleh mengakses semua ahli kelas luar, termasuk kelas peribadi. Ia berguna apabila kita ingin merangkum beberapa fungsi yang berkaitan secara langsung dengan kelas luar tetapi tidak semestinya perlu didedahkan.

Contoh Kelas Dalaman Ahli:

public class OuterClass {
    private int outerVar = 100;

    // Member inner class
    public class InnerClass {
        public void display() {
            System.out.println("Outer variable: " + outerVar);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}

Output:

public class OuterClass {
    private int outerVar = 100;

    // Member inner class
    public class InnerClass {
        public void display() {
            System.out.println("Outer variable: " + outerVar);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}

2. Kaedah Kelas Dalaman Tempatan

Kaedah kelas dalaman tempatan ditakrifkan dalam kaedah kelas luar. Kelas ini hanya boleh diakses dalam kaedah yang ditakrifkan. Ia biasanya digunakan apabila bahagian fungsi tertentu diperlukan hanya dalam kaedah tertentu.

Contoh Kaedah Kelas Dalaman Tempatan:

Outer variable: 100

Output:

public class OuterClass {
    public void display() {
        class InnerClass {
            public void print() {
                System.out.println("Method Local Inner Class");
            }
        }
        InnerClass inner = new InnerClass();
        inner.print();
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.display();
    }
}

3. Kelas Bersarang Statik

Satu kelas bersarang statik berkelakuan berbeza daripada kelas dalam kerana ia tidak mempunyai rujukan kepada tika kelas luar. Kelas ini hanya boleh mengakses ahli statik kelas luar dan sering digunakan apabila kefungsian kelas bersarang berkait rapat dengan kelas luar tetapi tidak memerlukan instance daripadanya.

Contoh Kelas Bersarang Statik:

Method Local Inner Class

Output:

public class OuterClass {
    private static int staticVar = 10;

    // Static nested class
    static class StaticNestedClass {
        public void display() {
            System.out.println("Static variable: " + staticVar);
        }
    }

    public static void main(String[] args) {
        OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
        nested.display();
    }
}

4. Kelas Dalaman Tanpa Nama

kelas dalaman tanpa nama ialah sejenis kelas dalaman tanpa nama tertentu. Kelas ini digunakan apabila terdapat keperluan untuk mengatasi atau melaksanakan kaedah dengan cepat, selalunya dengan antara muka atau kelas abstrak.

Contoh Kelas Dalaman Tanpa Nama:

Static variable: 10

Output:

public class Test {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("Anonymous Inner Class");
            }
        };
        new Thread(r).start();
    }
}

Perbandingan: Kelas Dalam lwn Kelas Bersarang

Feature Inner Class Static Nested Class
Association Associated with an instance of the outer class Not associated with an instance of the outer class
Access to Outer Class Members Can access all members, including private Can only access static members
Usage Useful for event handling and encapsulation Useful for utility classes related to the outer class without accessing instance-specific data

Java Inner Classes and Nested Classes

Amalan Terbaik dengan Kelas Dalaman dan Bersarang

  1. Gunakan Kelas Dalaman untuk Enkapsulasi: Pastikan kefungsian terikat rapat dengan kelas luar dalam kelas dalam untuk meningkatkan pengkapsulan.
  2. Kelas Bersarang Statik untuk Utiliti: Apabila anda memerlukan kelas pembantu yang tidak memerlukan akses kepada contoh kelas luar, gunakan kelas bersarang statik.
  3. Kelas Dalaman Tanpa Nama untuk Panggilan Balik: Dalam pengaturcaraan dipacu peristiwa, kelas dalaman tanpa nama boleh mengurangkan kekacauan kod, terutamanya untuk kelas sekali guna.
  4. Kaedah Kelas Dalaman Setempat Dengan Sedikit: Simpan kaedah kelas dalaman tempatan untuk kefungsian khusus dan setempat untuk mengelakkan struktur kod yang terlalu rumit.

Kelemahan Menggunakan Kelas Dalaman di Jawa

  1. Meningkatkan Kerumitan: Kelas dalaman boleh menjadikan kod lebih sukar dibaca, terutamanya apabila terdapat berbilang lapisan kelas dalaman. Kerumitan tambahan ini boleh mengelirukan pembangun yang tidak biasa dengan struktur kod.

  2. Pengurusan Memori: Kelas dalaman memegang rujukan kepada contoh kelas luar. Ini boleh meningkatkan penggunaan memori dan boleh menyebabkan kebocoran memori jika kejadian kelas dalaman digunakan untuk operasi jangka panjang, terutamanya dalam pembangunan Android.

  3. Pengujian Sukar dan Nyahpepijat: Memandangkan kelas dalam digandingkan rapat dengan kelas luarnya, ujian dan penyahpepijatan boleh menjadi lebih mencabar. Kod dalam kelas dalam selalunya bergantung pada konteks kelas luar, yang boleh menyukarkan ujian terpencil.

  4. Kebolehgunaan Semula Kod Dikurangkan: Kelas dalaman biasanya kurang boleh digunakan semula kerana ia digandingkan rapat dengan kelas luar. Menggunakan semula kelas dalaman di luar skop yang dimaksudkan biasanya memerlukan pengubahsuaian atau penstrukturan semula yang ketara.

  5. Sekatan Statik: Kelas dalaman bukan statik tidak boleh mengandungi ahli atau kaedah statik, yang mengehadkan fleksibilitinya dalam situasi tertentu.

Alternatif kepada Kelas Dalaman

  1. Kelas Peringkat Atas: Daripada mencipta kelas dalaman, tentukan kelas peringkat atas yang berasingan. Ini berguna apabila kelas tidak memerlukan akses terus ke medan dan kaedah peribadi kelas luar. Ia juga meningkatkan kebolehbacaan kod dan kebolehgunaan semula.

  2. Kelas Bersarang Statik: Jika anda tidak memerlukan kelas dalam untuk mengakses ahli kelas luar bukan statik, anda boleh menggunakan kelas bersarang statik. Kelas bersarang statik tidak mempunyai rujukan kepada tika kelas luar, jadi kelas itu lebih cekap ingatan.

  3. Kelas Tanpa Nama dengan Antara Muka Fungsian: Untuk pelaksanaan sekali guna, terutamanya untuk antara muka dengan satu kaedah (antara muka berfungsi), gunakan kelas tanpa nama atau ungkapan lambda. Ini adalah alternatif ringan kepada kelas dalaman dan boleh digunakan sebaris.

  4. Corak Kilang: Jika anda memerlukan akses terkawal kepada kejadian kelas dan ingin mengelakkan kelas dalaman, pertimbangkan untuk menggunakan Corak Reka Bentuk Kilang. Pendekatan ini membantu membuat kejadian objek tanpa mendedahkan butiran pelaksanaan, mengekalkan kod modular dan boleh diselenggara.

Java Inner Classes and Nested Classes

Dengan memahami pelbagai jenis kelas dalaman dan aplikasi uniknya, anda boleh menulis kod Java yang lebih modular dan boleh diselenggara.

Jika anda mendapati gambaran keseluruhan ini membantu, pastikan anda mengikuti lebih banyak siaran tentang topik Java lanjutan, petua dan amalan terbaik untuk meningkatkan perjalanan pengaturcaraan anda!

public class OuterClass {
    private int outerVar = 100;

    // Member inner class
    public class InnerClass {
        public void display() {
            System.out.println("Outer variable: " + outerVar);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}

Atas ialah kandungan terperinci Kelas Dalaman Java dan Kelas Bersarang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn