KodeGym/Blog Jawa/Acak/Kelas-kelas njero
John Squirrels
tingkat
San Francisco

Kelas-kelas njero

Diterbitake ing grup
Hi! Dina iki kita bakal njupuk topik penting - carane nested classes bisa digunakake ing Jawa. Jawa ngidini sampeyan nggawe kelas ing kelas liyane:
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
Kelas internal kasebut diarani nested. Padha dipérang dadi 2 jinis:
  1. Kelas bersarang non-statis. Iki uga disebut kelas batin.
  2. Kelas nested statis.
Sabanjure, kelas batin duwe rong subkategori sing béda. Saliyane kelas batin mung dadi kelas batin, bisa uga:
  • kelas lokal
  • kelas anonim
Bingung? :) Ora apa-apa. Punika diagram kanggo gamblang. Mbalik maneh nalika pelajaran yen dumadakan bingung! Kelas-kelas njero sing bersarang - 2Ing wulangan dina iki, kita bakal ngrembug babagan kelas njero (uga dikenal minangka kelas bersarang non-statis). Padha khusus disorot ing diagram sakabèhé supaya sampeyan ora ilang :) Ayo dadi miwiti karo pitakonan ketok: kok padha disebut "batin" kelas? Jawaban iki cukup prasaja: amarga padha digawe nang kelas liyane. Punika conto:
public class Bicycle {

   private String model;
   private int weight;

   public Bicycle(String model, int weight) {
       this.model = model;
       this.weight = weight;
   }

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

   public class Seat {

       public void up() {

           System.out.println("Seat up!");
       }

       public void down() {

           System.out.println("Seat down!");
       }
   }
}
Kene kita duwe Bicyclekelas. Wis 2 kolom lan 1 cara: start(). Kelas batin sing bersarang - 3Beda karo kelas biasa amarga ngemot rong kelas: Handlebarlan Seat. Kode kasebut ditulis ing njero Bicyclekelas. Iki minangka kelas lengkap: kaya sing sampeyan ngerteni, saben duwe cara dhewe. Ing wektu iki, sampeyan bisa uga duwe pitakonan: kenapa ing jagad iki kita bakal nyelehake kelas siji ing kelas liyane? Napa nggawe kelas batin? Ya, umpamane kita butuh kelas sing kapisah kanggo konsep stang lan kursi ing program kita. Mesthi wae, kita ora perlu nggawe nested! Kita bisa nggawe kelas biasa. Contone, kaya iki:
public class Handlebar {
   public void right() {
       System.out.println("Steer right!");
   }

   public void left() {

       System.out.println("Steer left");
   }
}

public class Seat {

   public void up() {

       System.out.println("Seat up!");
   }

   public void down() {

       System.out.println("Seat down!");
   }
}
Pitakonan sing apik banget! Mesthi, kita ora diwatesi dening teknologi. Nglakoni kuwi mesthi dadi pilihan. Ing kene, sing penting yaiku desain kelas sing bener saka sudut pandang program tartamtu lan tujuane. Kelas batin yaiku kanggo misahake entitas sing ora bisa dipisahake karo entitas liyane. Stang, kursi, lan pedal minangka komponen saka sepedha. Dipisahake saka sepedha, ora ana gunane. Yen kita nggawe kabeh konsep iki misahake kelas umum, kita bakal duwe kode kaya iki ing program kita:
public class Main {

   public static void main(String[] args) {
       Handlebar handlebar = new Handlebar();
       handlebar.right();
   }
}
Hmm... Makna kode iki malah angel diterangake. We have sawetara stang samar (Kenapa perlu? Ora idea, jujur). Lan gagang iki dadi nengen ... kabeh dhewe, tanpa sepedha ... kanggo sawetara alesan. Kanthi misahake konsep stang saka konsep sepeda, kita ilang sawetara logika ing program kita. Nggunakake kelas njero, kode kasebut katon beda banget:
public class Main {

   public static void main(String[] args) {

       Bicycle peugeot = new Bicycle("Peugeot", 120);
       Bicycle.Handlebar handlebar = peugeot.new Handlebar();
       Bicycle.Seat seat = peugeot.new Seat();

       seat.up();
       peugeot.start();
       handlebar.left();
       handlebar.right();
   }
}
Output konsol:
Seat up!
Let's go!
Steer left!
Steer right!
Saiki apa sing kita deleng tiba-tiba dadi akal! :) Kita nggawe obyek sepedha. Kita nggawe rong "subyek" sepeda - stang lan kursi. We wungu jog kanggo comfort lan mati kita tindak: pedaling lan setir minangka needed! :) Cara sing kita butuhake diarani obyek sing cocog. Kabeh iku prasaja lan trep. Ing conto iki, misahake stang lan jog nambah enkapsulasi (kita ndhelikake data babagan bagean sepeda ing kelas sing cocog) lan ngidini nggawe abstraksi sing luwih rinci. Saiki ayo ndelok kahanan sing beda. Upaminipun kita arep nggawe program sing simulates toko mancal lan spare parts kanggo pit. Kelas batin sing bersarang - 4Ing kahanan iki, solusi sadurunge kita ora bakal bisa. Ing toko sepedha, saben bagean sepedha duwe akal sanajan dipisahake saka sepedha. Contone, kita butuh cara kaya "adol pedal menyang pelanggan", "tuku kursi anyar", lan liya-liyane. Iku salah yen nggunakake kelas batin ing kene - saben bagean sepeda individu ing program anyar kita duwe makna sing tetep ana. dhewe: bisa dipisahake saka konsep sepedha. Iki persis sing kudu digatekake yen sampeyan mikir apa sampeyan kudu nggunakake kelas batin utawa ngatur kabeh entitas minangka kelas sing kapisah. Pemrograman berorientasi obyek apik amarga gampang kanggo nggawe model entitas ing donya nyata. Iki bisa dadi prinsip panuntun nalika mutusake nggunakake kelas batin. Ing toko nyata, spare parts sing kapisah saka pit - iki oke. Iki tegese iku uga oke nalika ngrancang program. Oke, kita wis ngerti "filosofi" :) Saiki ayo kenal karo fitur "teknis" penting saka kelas batin. Mangkene apa sing sampeyan kudu eling lan ngerti:
  1. Objek saka kelas njero ora bisa ana tanpa obyek saka kelas njaba.

    Iki nggawe akal: mula kita nggawe kelas Seatlan Handlebarkelas batin ing program kita - supaya kita ora entuk stang lan kursi yatim piatu.

    Kode iki ora kompilasi:

    public static void main(String[] args) {
    
       Handlebar handlebar = new Handlebar();
    }

    Fitur penting liyane saka iki:

  2. Objek saka kelas njero nduweni akses menyang variabel kelas njaba.

    Contone, ayo tambahake int seatPostDiametervariabel (nuduhake diameter kursi) ing Bicyclekelas kita.

    Banjur ing Seatkelas njero, kita bisa nggawe displaySeatProperties()metode sing nuduhake properti kursi:

    public class Bicycle {
    
       private String model;
       private int weight;
    
       private int seatPostDiameter;
    
       public Bicycle(String model, int weight, int seatPostDiameter) {
           this.model = model;
           this.weight = weight;
           this.seatPostDiameter = seatPostDiameter;
    
       }
    
       public void start() {
           System.out.println("Let's go!");
       }
    
       public class Seat {
    
           public void up() {
    
               System.out.println("Seat up!");
           }
    
           public void down() {
    
               System.out.println("Seat down!");
           }
    
           public void displaySeatProperties() {
    
               System.out.println("Seat properties: seatpost diameter = " + Bicycle.this.seatPostDiameter);
           }
       }
    }

    Lan saiki kita bisa nampilake informasi iki ing program kita:

    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle bicycle = new Bicycle("Peugeot", 120, 40);
           Bicycle.Seat seat = bicycle.new Seat();
    
           seat.displaySeatProperties();
       }
    }

    Output konsol:

    Seat properties: seatpost diameter = 40

    Cathetan:variabel anyar diumumake kanthi modifier akses paling ketat ( private). Lan isih kelas njero nduweni akses!

  3. Objek saka kelas njero ora bisa digawe kanthi cara statis saka kelas njaba.

    Iki diterangake kanthi fitur khusus babagan carane kelas batin diatur. Kelas njero bisa duwe konstruktor kanthi paramèter, utawa mung konstruktor standar. Nanging preduli, nalika kita nggawe obyek saka kelas utama, referensi kanggo obyek saka kelas njaba ora katon liwat obyek digawe saka kelas utama. Sawise kabeh, anane referensi obyek kasebut minangka syarat mutlak. Yen ora, kita ora bakal bisa nggawe obyek saka kelas njero.

    Nanging yen metode kelas njaba statis, mula kita bisa uga ora duwe obyek saka kelas njaba! Lan iki bakal nglanggar logika babagan cara kerja kelas batin. Ing kahanan iki, compiler bakal nggawe kesalahan:

    public static Seat createSeat() {
    
       // Bicycle.this cannot be referenced from a static context
       return new Seat();
    }
  4. Kelas njero ora bisa ngemot variabel lan metode statis.

    Logika kasebut padha: metode statis lan variabel bisa ana lan diarani utawa dirujuk sanajan ora ana obyek.

    Nanging tanpa obyek saka kelas njaba, kita ora bakal duwe akses menyang kelas njero.

    Kontradiksi sing jelas! Mulane variabel lan metode statis ora diidini ing kelas batin.

    Compiler bakal ngasilake kesalahan yen sampeyan nyoba nggawe:

    public class Bicycle {
    
       private int weight;
    
    
       public class Seat {
    
           // An inner class cannot have static declarations
           public static void displaySeatProperties() {
    
               System.out.println("Seat properties: seatpost diameter = " + Bicycle.this.seatPostDiameter);
           }
       }
    }
  5. Nalika nggawe obyek saka kelas njero, modifier akses iku penting.

    Kelas njero bisa ditandhani nganggo modifier akses standar: public, private, protected, lan package private.

    Kenapa iki penting?

    Iki mengaruhi ngendi kita bisa nggawe kedadean saka kelas njero ing program kita.

    Yen Seatkelas kita diumumake minangka public, kita bisa nggawe Seatobyek ing kelas liyane. Siji-sijine syarat yaiku obyek saka kelas njaba uga kudu ana.

    Miturut cara, kita wis nindakake iki ing kene:

    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle peugeot = new Bicycle("Peugeot", 120);
           Bicycle.Handlebar handlebar = peugeot.new Handlebar();
           Bicycle.Seat seat = peugeot.new Seat();
    
           seat.up();
           peugeot.start();
           handlebar.left();
           handlebar.right();
       }
    }

    Kita gampang entuk akses menyang Handlebarkelas njero saka Mainkelas.

    Yen kita ngumumake kelas njero minangka private, kita bakal bisa nggawe obyek mung ing kelas njaba.

    SeatKita ora bisa nggawe obyek "ing njaba" maneh :

    private class Seat {
    
       // Methods
    }
    
    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle bicycle = new Bicycle("Peugeot", 120, 40);
    
           // Bicycle.Seat has private access in Bicycle
           Bicycle.Seat seat = bicycle.new Seat();
       }
    }

    Sampeyan mbokmenawa wis ngerti logika :)

  6. Modifiers akses kanggo kelas njero bisa digunakake padha karo variabel biasa.

    Modifier protectednyedhiyakake akses menyang variabel conto ing subclass lan kelas sing ana ing paket sing padha.

    protecteduga dianggo kanggo kelas batin. Kita bisa nggawe protectedobyek saka kelas njero:

    • ing kelas njaba;
    • ing subclasses sawijining;
    • ing kelas sing ana ing paket sing padha.

    Yen kelas njero ora duwe modifier akses ( package private), obyek saka kelas njero bisa digawe:

    • ing kelas njaba;
    • ing kelas sing ana ing paket sing padha.

    Sampeyan wis suwe kenal karo modifiers, mula ora ana masalah ing kene.

Semene wae :) Nanging aja kendho! Kelas batin minangka topik sing cukup ekstensif sing bakal terus ditliti ing pawulangan sabanjure. Saiki sampeyan bisa nyegerake memori babagan pelajaran kursus babagan kelas batin . Lan sabanjure, ayo ngomong babagan kelas bersarang statis.
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar