JavaRush /Blog Jawa /Random-JV /Kelas, jinis kelas nested karo conto
Ярослав
tingkat
Днепр

Kelas, jinis kelas nested karo conto

Diterbitake ing grup
Halo kabeh. Ing topik iki, aku pengin ngomong kanthi rinci babagan kelas-kelas Jawa lan jinis-jinise supaya bisa mbantu para pamula ngerti topik iki, lan bisa uga wong sing ora anyar sinau babagan sing anyar. Yen bisa, kabeh bakal ditampilake nggunakake conto nyata kanthi conto kode. Ayo dadi miwiti. Kelas, jinis kelas nested kanthi conto - 1Lan aku pengin Wigati sing utama kanggo ngerti rong jinis pisanan saka kelas, lan lokal lan anonim mung subtipe saka kelas utama.

Apa iku kelas?

Kelas minangka katrangan logis babagan apa wae, cithakan sing sampeyan bisa nggawe kedadeyan nyata babagan perkara kasebut. Ing tembung liya, iki mung minangka gambaran babagan entitas sing digawe: apa sifat lan cara sing kudu diduweni. Properti minangka karakteristik entitas, metode minangka tumindak sing bisa ditindakake. Conto apik saka kelas saka urip nyata, kang menehi pangerten apa kelas, bisa dianggep gambar: gambar digunakake kanggo njlèntrèhaké struktur (catapult, screwdriver), nanging drawing ora desain. Kaya para insinyur nggunakake cetak biru kanggo nggawe desain, pemrograman nggunakake kelas kanggo nggawe obyek sing nggambarake sifat lan 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
}
Ing conto iki, kita nggawe kelas Jawa sing njlèntrèhaké entitas "murid": saben siswa duwe jeneng, klompok lan khusus. Saiki, ing panggonan liyane ing program, kita bisa nggawe conto nyata saka kelas iki. Ing tembung liya: yen kelas Studentminangka potret apa sing kudu dadi siswa, mula sing digawe yaiku siswa sing sejatine. Conto nggawe siswa anyar: new Student("Ivan", "KI-17-2", "Computer Engineering");Operator newnggoleki kelas Studentbanjur nelpon metode khusus (konstruktor) kelas iki. Konstruktor ngasilake obyek kelas sing wis siap Student- siswa sing luwe, luwe tanpa beasiswa :))

Jinis-jinis kelas ing basa Jawa

Ing Jawa ana 4 jinis kelas ing kelas liyane:
  1. Kelas njero bersarang yaiku kelas non-statis ing njero kelas njaba.

  2. Kelas statis bersarang yaiku kelas statis ing njero kelas njaba.

  3. Kelas lokal Jawa minangka kelas ing metode.

  4. Kelas Java anonim yaiku kelas sing digawe kanthi cepet.

Kita bakal ngomong babagan saben wong kanthi kapisah.

Kelas non-statis ing njero kelas njaba

Kaping pisanan, aku pengin sampeyan ngerti apa iki kanthi conto nyata, amarga luwih gampang dingerteni. Dadi saiki kita bakal ngrusak barang gedhe dadi komponen sing luwih cilik, lan kita bakal mbongkar pesawat! Nanging, kanggo conto, cukup kanggo nuduhake sethithik, kita ora bakal ngilangi kabeh. Kanggo nggambarake proses iki, kita bakal nggunakake diagram pesawat. Kelas, jinis kelas nested kanthi conto - 2 Pisanan, kita kudu nggawe kelas Airplanesing bisa nambah katrangan sethithik: jeneng 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
}
Saiki kita pengin nambah swiwi. Nggawe kelas sing kapisah? Mbok menawa iki logika yen kita duwe program Komplek kanggo ngrancang pesawat, lan ing ngendi kita kudu nggawe nomer ageng saka kelas asale (kelas sing duwe logika padha karo kelas induk, yaiku, kelas saka kang padha warisan, nanging supaya padha ngluwihi kelas tiyang sepah kanthi nambah logika utawa ciri sing luwih rinci), nanging apa yen kita mung duwe game ngendi kita duwe pesawat siji? Banjur bakal luwih rasional yen kita ngrampungake kabeh struktur ing sak panggonan (ing sak kelas). Iki ngendi kelas nested non-statis teka menyang muter. Ateges, iki minangka katrangan sing luwih rinci babagan sawetara rincian kelas eksternal kita. Ing conto iki, kita kudu nggawe swiwi kanggo pesawat - kiwa lan tengen. Ayo nggawe!
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
}
Dadi kita nggawe kelas nested non-statis Wing(swiwi) nang kelas Airplane(pesawat), lan nambah loro variabel - swiwi kiwa lan swiwi tengen. Lan saben swiwi duwe sifat dhewe (warna, model) sing bisa kita ganti. Kanthi cara iki sampeyan bisa ngatur struktur sing dibutuhake. Lan cathetan: sadurungé ing diagram ana cukup akèh bagean kanggo pesawat, lan, ing kasunyatan, kita bisa dibagi kabeh bagean menyang kelas internal, nanging proses kuwi ora tansah dianjurake. Momen kasebut kudu dilacak gumantung saka tugas. Sampeyan bisa uga ora butuh sayap kanggo ngatasi masalah kasebut. Banjur ora perlu nglakoni. Iku kaya ngethok wong dadi sikil, tangan, awak lan sirah - bisa uga, nanging kenapa yen kelas iki mung digunakake kanggo nyimpen data babagan wong? Fitur kelas Java nested non-statis:
  1. Dheweke mung ana ing obyek, dadi kanggo nggawe sampeyan butuh obyek. Ing tembung liya: kita ngrancang sayap kita dadi bagian saka pesawat, mula kanggo nggawe sayap kita butuh pesawat, yen ora, kita ora butuh.
  2. Ora ana variabel statis ing kelas Java. Yen sampeyan butuh sawetara konstanta utawa liyane statis, sampeyan kudu mindhah menyang kelas njaba. Iki amarga kopling cedhak saka kelas nested non-statis kanggo kelas njaba.
  3. Kelas kasebut nduweni akses lengkap menyang kabeh lapangan pribadi ing kelas njaba. Fitur iki dianggo kanthi rong cara.
  4. Sampeyan bisa njaluk referensi kanggo Kayata saka kelas external. Tuladha: Pesawat.iki link menyang pesawat, iki link menyang swiwi.

Kelas statis ing njero kelas njaba

Kelas jinis iki ora beda karo kelas njaba biasa, kajaba mung siji: kanggo nggawe conto kelas kasebut, sampeyan kudu dhaptar kabeh path saka kelas njaba menyang kelas sing dikarepake, dipisahake karo titik. Contone: Building.Plaftorm platform = new Building.Platform(); Kelas statis digunakake kanggo nyelehake kelas sing ana gandhengane supaya struktur logis luwih gampang digarap. Contone: kita bisa nggawe kelas eksternal Building, ing ngendi bakal ana dhaptar kelas tartamtu sing bakal makili bangunan tartamtu.
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
}
Conto iki nduduhake carane kelas statis ngidini sampeyan ngemas struktur logis menyang wangun sing luwih trep. Yen ora ana, kita kudu nggawe 4 kelas sing beda. Keuntungan saka pendekatan iki:
  1. Cacahe kelas wis suda.
  2. Kabeh kelas ana ing njero kelas wong tuwane. Kita bisa nglacak kabeh hirarki tanpa mbukak saben kelas kanthi kapisah.
  3. Kita bisa ngrujuk menyang kelas Building, lan IDE bakal njaluk kabeh dhaptar kabeh subclass saka kelas iki. Iki bakal luwih gampang kanggo nemokake kelas sing sampeyan butuhake lan nuduhake kabeh gambar kanthi luwih holistik.
Conto nggawe conto saka kelas statis nested:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); Aku uga kaya Wigati sing strategi iki digunakake ing kelas AWT 2D kanggo njlèntrèhaké wangun, kayata Line2D, Arc2D, Ellipse2D lan liyane.

Kelas lokal

Kelas kasebut diumumake ing cara liya. Nyatane, dheweke duwe kabeh sifat kelas nested non-statis, mung contone mung bisa digawe ing metode, lan metode kasebut ora bisa statis (kanggo nggawe sampeyan butuh conto kelas eksternal, referensi menyang Kayata saka obyek nelpon implicitly liwati menyang cara non-statis, lan ing cara statis ora ana cara kanggo link iki). Nanging padha duwe ciri dhewe:
  1. Kelas lokal mung bisa digunakake karo variabel metode final. Bab kasebut yaiku conto kelas lokal bisa disimpen ing tumpukan sawise metode rampung, lan variabel kasebut bisa dibusak. Yen variabel kasebut diumumake final, banjur kompiler bisa nyimpen salinan variabel kasebut kanggo nggunakake obyek kasebut. Lan siji liyane: wiwit 8+ versi Jawa, sampeyan bisa nggunakake variabel non-final ing kelas lokal, nanging mung ing syarat sing padha ora ngganti.
  2. Kelas lokal ora bisa diumumake kanthi modifier akses.
  3. Kelas lokal duwe akses menyang variabel metode.
Kelas lokal bisa ditemokake arang banget, amarga nggawe kode angel diwaca lan ora duwe kaluwihan, kajaba siji - akses menyang variabel metode. Aku ora ngerti apa conto kelas lokal bisa dijupuk sing bakal nuduhake nggunakake efektif, supaya aku mung nuduhake conto. Ayo ngomong yen kita duwe kelas Person(bakal dianggep minangka wong) kanthi properti street(dalan), house(omah). Kita pengin bali sawetara obyek kanggo ngakses mung lokasi wong. Kanggo nindakake iki, kita nggawe antarmuka AddressContainer, sing nuduhake panyimpenan data babagan lokasi wong.
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
}
Kaya sing sampeyan ngerteni, ing jero metode kita nggawe kelas sing ngetrapake panyimpenan lokasi wong, nggawe variabel konstan ing kana (supaya sawise metu saka metode kasebut, variabel kasebut disimpen ing obyek) lan ngetrapake cara kanggo entuk alamat lan omah. Saiki kita bisa nggunakake obyek iki ing panggonan liyane ing program kanggo njaluk lokasi wong. Aku ngerti yen conto iki ora becik lan bakal luwih bener kanggo nindakake mung kanthi ninggalake getter ing kelas Person, nanging nggawe kelas iki lan panggunaan sing bisa ditampilake, banjur sampeyan kudu.

Kelas anonim

Ing hood, kelas anonim mung kelas nested non-statis biasa. Keanehane yaiku gampang digunakake. Sampeyan bisa nulis kelas langsung nalika nggawe conto kelas liyane.
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!");
        }
    }
}
Intine, kita mung nggabungake rong perkara ing sak panggonan: nggawe instance saka siji kelas ( Animal) lan nggawe instance saka kelas inheritor ( Tiger). Yen ora, kita kudu nggawe kelas kanthi kapisah lan nggunakake konstruksi sing luwih dawa kanggo entuk asil sing padha. Panggunaan kelas anonim dibenerake ing pirang-pirang kasus, utamane nalika:
  • awak kelas cendhak banget;
  • mung siji conto saka kelas sing dibutuhake;
  • kelas digunakake ing panggonan kang digawe utawa sanalika sawise iku;
  • Jeneng kelas ora penting lan ora nggawe kode luwih gampang dingerteni.
Kelas anonim asring digunakake ing GUI kanggo nggawe pawang acara. Contone, kanggo nggawe tombol lan nanggepi klik:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
Nanging, sawise Java 8, dheweke wiwit nggunakake ekspresi lambda, nanging isih akeh kode sing ditulis sadurunge versi 8 lan sampeyan bisa uga nemoni (lan bakal ditemoni sajrone latihan JavaRush) prasasti kasebut.\ Analog karo lambdas:
JButton b2 = new JButton("Click");
b2.addActionListener(e -> System.out.println("Кнопка нажата!"));
Pungkasan artikel Matur nuwun kanggo perhatian sampeyan lan muga-muga sampeyan sinau babagan sing anyar utawa ngerti babagan sing sadurunge durung dingerteni. Aku uga pengin njlentrehake manawa artikel iki kalebu ing kategori "perhatian rinci" . Iki minangka karya pisananku, mula muga-muga bisa migunani kanggo sapa wae. Ing mangsa ngarep, yen ide anyar teka, aku bakal nyoba nulis liyane, aku mung duwe ide siji ... Good luck kanggo kabeh lan sukses ing program :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION