JavaRush /Java Blog /Random-ID /Kelas, jenis kelas bersarang dengan contoh
Ярослав
Level 40
Днепр

Kelas, jenis kelas bersarang dengan contoh

Dipublikasikan di grup Random-ID
Halo semua. Dalam topik ini, saya ingin membahas secara detail tentang kelas Java dan tipenya untuk membantu pemula memahami topik ini, dan mungkin non-pemula mempelajari sesuatu yang baru. Jika memungkinkan, semuanya akan ditampilkan menggunakan contoh kehidupan nyata dengan contoh kode yang menyertainya. Mari kita mulai. Kelas, jenis kelas bersarang dengan contoh - 1Dan saya ingin mencatat bahwa hal utama adalah memahami dua jenis kelas pertama, dan lokal dan anonim hanyalah subtipe dari kelas dalam.

Apa itu kelas?

Kelas adalah deskripsi logis dari sesuatu, sebuah templat yang dengannya Anda dapat membuat contoh nyata dari sesuatu itu. Dengan kata lain, ini hanyalah deskripsi tentang seperti apa seharusnya entitas yang dibuat: properti dan metode apa yang harus dimilikinya. Properti adalah karakteristik suatu entitas, metode adalah tindakan yang dapat dilakukannya. Contoh kelas yang baik dari kehidupan nyata, yang memberikan pemahaman tentang apa itu kelas, dapat dianggap sebagai gambar: gambar digunakan untuk mendeskripsikan struktur (ketapel, obeng), tetapi gambar bukanlah desain. Sama seperti insinyur menggunakan cetak biru untuk membuat desain, pemrograman menggunakan kelas untuk membuat objek yang menjelaskan properti dan metode.
public class Student {
    private String name, group, specialty;

    public Student(String name, String group, String specialty) {
       this.name = name;
       this.group = group;
       this.specialty = specialty;
   }

   // getters/setters
}
Dalam contoh ini, kami membuat kelas Java yang menggambarkan entitas “siswa”: setiap siswa memiliki nama, kelompok, dan spesialisasi. Sekarang, di tempat lain dalam program ini, kita dapat membuat contoh nyata dari kelas ini. Dengan kata lain: jika kelas Studentmerupakan gambaran bagaimana seharusnya seorang siswa, maka instance yang tercipta adalah siswa itu sendiri. Contoh pembuatan siswa baru: new Student("Ivan", "KI-17-2", "Computer Engineering");Operator newmencari kelas tersebut Studentdan kemudian memanggil metode khusus (konstruktor) kelas tersebut. Konstruktor mengembalikan objek kelas yang sudah jadi Student- siswa kami yang terkasih dan lapar tanpa beasiswa :))

Jenis kelas di Java

Di Java ada 4 macam kelas di dalam kelas lain:
  1. Kelas dalam bersarang adalah kelas non-statis di dalam kelas luar.

  2. Kelas statis bersarang adalah kelas statis di dalam kelas luar.

  3. Kelas lokal Java adalah kelas dalam metode.

  4. Kelas Java anonim adalah kelas yang dibuat dengan cepat.

Kami akan membicarakannya masing-masing secara terpisah.

Kelas non-statis di dalam kelas luar

Pertama, saya ingin Anda memahami hal ini dengan contoh nyata, karena akan lebih mudah untuk memahaminya. Jadi sekarang kita akan memecah benda yang sangat besar menjadi komponen-komponen yang lebih kecil, dan kita akan membongkar sebuah pesawat terbang! Namun, sebagai contoh saja cukup dengan menunjukkan sedikit saja, kami tidak akan menguraikannya secara keseluruhan. Untuk memvisualisasikan proses ini, kita akan menggunakan diagram pesawat. Kelas, jenis kelas bersarang dengan contoh - 2 Pertama, kita perlu membuat kelas Airplanedimana kita bisa menambahkan sedikit deskripsi: nama pesawat, kode identifikasi, penerbangan.
public class Airplane {
    private String name, id, flight;

    public Airplane(String name, String id, String flight) {
        this.name = name;
        this.id = id;
        this.flight = flight;
    }

    // getters/setters
}
Sekarang kami ingin menambahkan sayap. Buat kelas terpisah? Mungkin ini logikanya jika kita mempunyai program yang kompleks untuk merancang pesawat terbang, dan di mana kita perlu membuat sejumlah besar kelas turunan (kelas yang memiliki logika yang sama dengan kelas induknya, yaitu kelas yang diwarisinya, tetapi jadi mereka memperluas kelas induk dengan menambahkan logika atau karakteristik yang lebih detail), namun bagaimana jika kita hanya memiliki permainan yang hanya memiliki satu bidang? Maka akan lebih rasional jika kita menyelesaikan seluruh struktur di satu tempat (dalam satu kelas). Di sinilah kelas bersarang non-statis berperan. Intinya, ini adalah penjelasan lebih rinci tentang beberapa detail kelas eksternal kami. Dalam contoh ini, kita perlu membuat sayap untuk pesawat terbang - kiri dan kanan. Ayo berkreasi!
public class Airplane {
    private String name, id, flight;
    private Wing leftWing = new Wing("Red", "X3"), rightWing = new Wing("Blue", "X3");

    public Airplane(String name, String id, String flight) {
        this.name = name;
        this.id = id;
        this.flight = flight;
    }

    private class Wing {
        private String color, model;

        private Wing(String color, String model) {
            this.color = color;
            this.model = model;
        }

        // getters/setters
    }

    // getters/setters
}
Jadi kita membuat kelas bersarang non-statis Wing(sayap) di dalam kelas Airplane(pesawat), dan menambahkan dua variabel - sayap kiri dan sayap kanan. Dan setiap sayap memiliki sifatnya masing-masing (warna, model) yang bisa kita ubah. Dengan cara ini Anda dapat mengatur staf struktur sebanyak yang Anda butuhkan. Dan perhatikan: sebelumnya pada diagram terdapat cukup banyak bagian untuk pesawat, dan sebenarnya kita dapat membagi semua bagian ke dalam kelas internal, tetapi proses seperti itu tidak selalu disarankan. Momen seperti itu perlu ditelusuri tergantung pada tugasnya. Anda mungkin tidak memerlukan sayap sama sekali untuk menyelesaikan masalah. Maka tidak perlu melakukannya. Ini seperti memotong seseorang menjadi kaki, lengan, batang tubuh dan kepala - mungkin saja, tetapi mengapa jika kelas ini hanya digunakan untuk menyimpan data tentang orang? Fitur kelas Java bersarang non-statis:
  1. Mereka hanya ada di objek, jadi untuk membuatnya Anda memerlukan sebuah objek. Dengan kata lain: kita merancang sayap kita untuk menjadi bagian dari pesawat terbang, jadi untuk membuat sayap kita memerlukan pesawat terbang, jika tidak, kita tidak memerlukannya.
  2. Tidak boleh ada variabel statis di dalam kelas Java. Jika Anda memerlukan beberapa konstanta atau hal lain yang statis, Anda perlu memindahkannya ke kelas luar. Hal ini disebabkan oleh keterkaitan erat antara kelas bersarang non-statis dengan kelas luar.
  3. Kelas memiliki akses penuh ke semua bidang privat kelas luar. Fitur ini bekerja dalam dua cara.
  4. Anda bisa mendapatkan referensi ke instance kelas eksternal. Contoh: Pesawat terbang.ini link ke pesawat terbang, ini link ke sayap.

Kelas statis di dalam kelas luar

Jenis kelas ini tidak berbeda dengan kelas luar biasa, kecuali satu hal: untuk membuat turunan dari kelas tersebut, Anda perlu membuat daftar seluruh jalur dari kelas luar ke kelas yang diinginkan, dipisahkan oleh sebuah titik. Misalnya: Building.Plaftorm platform = new Building.Platform(); Kelas statis digunakan untuk meletakkan kelas-kelas terkait secara berdampingan sehingga struktur logikanya lebih mudah untuk dikerjakan. Misalnya: kita dapat membuat kelas eksternal Building, di mana akan ada daftar kelas tertentu yang akan mewakili bangunan tertentu.
public abstract class Building {
    private String name, address, type;

    Building(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public static class Platform extends Building {
        public Platform(String name, String address) {
            super(name, address);
            setType("Platform");
        }

        // some additional logic
    }

    public static class House extends Building {
        public House(String name, String address) {
            super(name, address);
            setType("House");
        }

        // some additional logic
    }

    public static class Shop extends Building {
        public Shop(String name, String address) {
            super(name, address);
            setType("Shop");
        }

        // some additional logic
    }

    // getters/setters
}
Contoh ini menunjukkan bagaimana kelas statis memungkinkan Anda mengemas struktur logis ke dalam bentuk yang lebih nyaman. Jika tidak ada, kita perlu membuat 4 kelas yang sangat berbeda. Keuntungan dari pendekatan ini:
  1. Jumlah kelas berkurang.
  2. Semua kelas berada di dalam kelas induknya. Kami dapat menelusuri seluruh hierarki tanpa membuka setiap kelas secara terpisah.
  3. Kita bisa merujuk ke kelas Bangunan, dan IDE akan menampilkan seluruh daftar semua subkelas dari kelas ini. Ini akan mempermudah menemukan kelas yang Anda perlukan dan menampilkan gambaran keseluruhan secara lebih holistik.
Contoh pembuatan instance kelas statis bersarang:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); Saya juga ingin mencatat bahwa strategi ini digunakan di kelas AWT 2D untuk mendeskripsikan bentuk, seperti Line2D, Arc2D, Ellipse2D, dan lainnya.

Kelas lokal

Kelas-kelas ini dideklarasikan di dalam metode lain. Faktanya, mereka memiliki semua properti kelas bersarang non-statis, hanya instance mereka yang hanya dapat dibuat dalam suatu metode, dan metode tersebut tidak boleh statis (untuk membuatnya, Anda memerlukan instance kelas eksternal, referensi ke kelas contoh objek pemanggil secara implisit diteruskan ke metode non-statis, dan dalam metode statis tidak ada metode untuk tautan ini). Namun mereka mempunyai ciri khasnya masing-masing:
  1. Kelas lokal hanya dapat bekerja dengan variabel metode final. Masalahnya adalah instance kelas lokal dapat disimpan di heap setelah metode selesai, dan variabel dapat dihapus. Jika variabel dinyatakan final, maka compiler dapat menyimpan salinan variabel tersebut untuk digunakan nanti oleh objek. Dan satu hal lagi: sejak Java versi 8+, Anda dapat menggunakan variabel non-final di kelas lokal, tetapi hanya dengan syarat variabel tersebut tidak berubah.
  2. Kelas lokal tidak dapat dideklarasikan dengan pengubah akses.
  3. Kelas lokal memiliki akses ke variabel metode.
Kelas lokal sangat jarang ditemukan, karena membuat kode sulit dibaca dan tidak memiliki keuntungan apa pun, kecuali satu - akses ke variabel metode. Saya tidak tahu contoh kelas lokal apa yang dapat diambil yang menunjukkan kegunaannya yang efektif, jadi saya hanya akan menunjukkan contoh saya. Katakanlah kita memiliki kelas Person(diasumsikan bahwa ini adalah orang) dengan properti street(jalan), house(rumah). Kami ingin mengembalikan beberapa objek untuk mengakses lokasi orang tersebut saja. Untuk melakukan ini, kami membuat antarmuka AddressContainer, yang berarti penyimpanan data tentang lokasi seseorang.
public class Person {
    private String name, street, house;

    public Person(String name, String street, String house) {
        this.name = name;
        this.street = street;
        this.house = house;
    }

    private interface AddressContainer {
        String getStreet();
        String getHouse();
    }

    public AddressContainer getAddressContainer() {
        class PersonAddressContainer implements AddressContainer {
            final String street = Person.this.street, house = Person.this.house;

            @Override
            public String getStreet() {
                return this.street;
            }

            @Override
            public String getHouse() {
                return this.house;
            }
        }

        return new PersonAddressContainer();
    }

    public static void main(String[] args) {
        Person person = new Person("Nikita", "Sholohova", "17");

        AddressContainer address = person.getAddressContainer();

        System.out.println("Address: street - " + address.getStreet() + ", house - " + address.getHouse());
    }

    // getters/setters
}
Seperti yang Anda lihat, di dalam metode kami membuat kelas yang mengimplementasikan penyimpanan lokasi seseorang, membuat variabel konstan di sana (sehingga setelah keluar dari metode, variabel disimpan dalam objek) dan mengimplementasikan metode untuk mendapatkan alamat dan rumah. Sekarang kita bisa menggunakan objek ini di tempat lain dalam program untuk mendapatkan lokasi seseorang. Saya memahami bahwa contoh ini tidak ideal dan akan lebih tepat jika melakukannya hanya dengan meninggalkan getter di kelas Person, namun, pembuatan kelas ini dan kemungkinan penggunaannya ditampilkan, dan terserah Anda.

Kelas anonim

Pada dasarnya, kelas anonim hanyalah kelas bersarang non-statis biasa. Keunikan mereka adalah kemudahan penggunaannya. Anda dapat menulis kelas Anda secara langsung saat membuat turunan dari kelas lain.
public class Animal {
    public void meow() {
        System.out.println("Meow!");
    }

    public static void main(String[] args) {
        Animal anonTiger = new Animal() {
            @Override
            public void meow() {
                System.out.println("Raaar!");
            }
        };

        Animal notAnonTiger = new Animal().new Tiger();

        anonTiger.meow(); // будет выведено Raaar!
        notAnonTiger.meow(); // будет выведено Raaar!
    }

    private class Tiger extends Animal {
        @Override
        public void meow() {
            System.out.println("Raaar!");
        }
    }
}
Pada dasarnya, kita hanya menggabungkan dua hal di satu tempat: membuat sebuah instance dari satu kelas ( Animal) dan membuat sebuah instance dari kelas dalam pewarisnya ( Tiger). Jika tidak, kita perlu membuat kelas secara terpisah dan menggunakan konstruksi yang lebih panjang untuk mencapai hasil yang sama. Penggunaan kelas anonim dibenarkan dalam banyak kasus, khususnya ketika:
  • badan kelasnya sangat pendek;
  • hanya satu instance kelas yang diperlukan;
  • kelas digunakan di tempat pembuatannya atau segera setelahnya;
  • Nama kelas tidak penting dan tidak membuat kode lebih mudah dipahami.
Kelas anonim sering digunakan di GUI untuk membuat event handler. Misalnya, untuk membuat tombol dan bereaksi terhadap kliknya:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
Namun, setelah Java 8 mereka mulai menggunakan ekspresi lambda, tetapi masih banyak kode yang ditulis sebelum versi 8 dan Anda mungkin menemukan (dan akan Anda temui selama pelatihan Anda di JavaRush) prasasti seperti itu.\ Analog dengan lambda:
JButton b2 = new JButton("Click");
b2.addActionListener(e -> System.out.println("Кнопка нажата!"));
Akhir artikel Terima kasih atas perhatian Anda dan saya harap Anda mempelajari sesuatu yang baru atau memahami sesuatu yang tidak Anda pahami sebelumnya. Saya juga ingin mengklarifikasi bahwa artikel ini termasuk dalam kategori “perhatian terhadap detail” . Ini adalah karya pertama saya, jadi saya harap ini bermanfaat bagi seseorang. Dalam waktu dekat, ketika ide-ide baru datang, saya akan mencoba menulis sesuatu yang lain, saya hanya punya satu ide... Semoga sukses semuanya dan sukses dalam pemrograman :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION