JavaRush /Blog Jawa /Random-JV /Kelas batin bersarang utawa Kelas Batin ing Jawa

Kelas batin bersarang utawa Kelas Batin ing Jawa

Diterbitake ing grup
Hello! Dina iki kita bakal miwiti ndeleng topik penting - carane nested classes bisa digunakake ing Jawa. Ing basa Inggris diarani nested classes. Jawa ngidini sampeyan nggawe sawetara kelas ing liyane:
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
Iki kelas sing diarani nested. Padha dipérang dadi 2 jinis:
  1. Kelas bersarang non-statis - kelas bersarang non-statis. Dheweke uga diarani kelas batin kanthi cara liya.
  2. Kelas nested statis - kelas nested statis.
Sabanjure, kelas batin duwe rong subtipe khusus. Saliyane kasunyatan manawa kelas batin mung bisa dadi kelas batin, bisa uga:
  • kelas lokal
  • kelas anonim
Rada angel? :) Ora apa-apa, iki diagram kanggo gamblang. Mbalik maneh nalika ceramah yen dumadakan bingung! Kelas-kelas njero sing bersarang - 2Ing kuliah dina iki kita bakal ngomong babagan kelas Inner - kelas internal (uga kelas nested non statis, kelas nested non-statis). Padha disorot khusus ing diagram umum supaya sampeyan ora kesasar :) Ayo dadi miwiti karo pitakonan sing jelas: kenapa kelas kasebut diarani "internal"? Jawaban iki cukup prasaja: amarga padha digawe nang kelas liyane. Iki contone:
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("Go!");
   }

   public class HandleBar {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

   public class Seat {

       public void up() {

           System.out.println("The seat is up!");
       }

       public void down() {

           System.out.println("The seat is down!");
       }
   }
}
Ing kene kita duwe kelas Bicycle- sepeda. Wis 2 kolom lan 1 cara - start(). Kelas batin sing bersarang - 3Bedane karo kelas reguler yaiku rong kelas, kode sing ditulis ing njero Bicycle- yaiku kelas HandleBar(setir) lan Seat(jok). Iki minangka kelas lengkap: kaya sing sampeyan ngerteni, saben duwe cara dhewe. Ing titik iki, sampeyan bisa uga duwe pitakonan: kenapa kita sijine siji kelas ing liyane? Apa nggawe wong internal? Oke, ayo ngomong kita kudu kelas kapisah kanggo setir lan jog ing program. Nanging sampeyan ora kudu nest wong! Sampeyan bisa nggawe kelas biasa. Contone, kaya iki:
public class HandleBar {
   public void right() {
       System.out.println("Steering wheel to the right!");
   }

   public void left() {

       System.out.println("Steering wheel left");
   }
}

public class Seat {

   public void up() {

       System.out.println("The seat is up!");
   }

   public void down() {

       System.out.println("The seat is down!");
   }
}
Pitakonan sing apik banget! Mesthi, kita ora duwe watesan teknis - kita bisa nindakake kanthi cara iki. Iku luwih akeh babagan ngrancang kelas kanthi bener saka sudut pandang program tartamtu lan ing makna program kasebut. Kelas batin yaiku kelas kanggo nyorot entitas tartamtu ing program sing ora bisa dipisahake karo entitas liyane. Setir, jog, pedal minangka komponen saka sepedha. Dipisahake saka sepedha, dheweke ora duwe akal. Yen kita nggawe kabeh kelas iki misahake kelas umum, program kita bisa duwe, contone, kode ing ngisor iki:
public class Main {

   public static void main(String[] args) {
       HandleBar handleBar = new HandleBar();
       handleBar.right();
   }
}
Ummm... Tegese kode iki malah angel diterangake. Kita duwe stang sepeda sing aneh (kenapa perlu? Ora ngerti, jujur). Lan setir iki dadi nengen ... dhewe, tanpa sepedha ... kanggo sawetara alesan. Kanthi misahake inti saka setir saka inti saka pit, kita wis ilang logika 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:

Сиденье поднято выше!
Поехали!
Руль влево!
Руль вправо!
Apa sing kedadeyan dumadakan dadi akal! :) Kita wis nggawe obyek sepedha. Kita nggawe loro "subyek" - setir lan jog. Kita ngunggahake lenggahan sing luwih dhuwur supaya luwih gampang - lan banjur lunga: muter lan kemudi menyang ngendi wae! :) Cara sing kita butuhake diarani obyek sing dibutuhake. Kabeh iku prasaja lan trep. Ing conto iki, nyorot stang lan jog nambah enkapsulasi (kita ndhelikake data babagan bagean sepeda ing kelas sing cocog), lan ngidini kita nggawe abstraksi sing luwih rinci. Saiki ayo ndelok kahanan liyane. Contone, kita pengin nggawe program sing nggawe model toko sepeda lan komponen. Kelas batin sing bersarang - 4Ing kahanan iki, solusi sadurunge kita bakal gagal. Ing watesan saka toko bagean, saben bagean individu saka mancal nduweni teges malah loro saka inti saka mancal. Contone, kita butuh cara kaya "adol pedal menyang panuku", "tuku kursi anyar", lsp. Iki bakal dadi kesalahan yen nggunakake kelas internal ing kene - saben bagean sepeda ing program anyar kita duwe makna dhewe: kapisah saka inti saka sepeda, lan ora ana gandhengane. Iki sing kudu digatekake yen sampeyan mikir apa sampeyan kudu nggunakake kelas batin, utawa misahake kabeh entitas dadi kelas sing kapisah. Pemrograman berorientasi obyek pancen apik amarga nggawe model entitas ing jagad nyata. Iki sing bisa digunakake minangka pandhuan nalika mutusake nggunakake kelas batin. Ing toko nyata, bagean kapisah saka pit - iki normal. Iki tegese iki bakal bener nalika ngrancang program. Oke, kita wis ngurutake "filosofi" :) Saiki ayo kenal karo fitur "teknis" penting saka kelas batin. Mangkene sing sampeyan kudu eling lan ngerti:
  1. Objek saka kelas njero ora bisa ana tanpa obyek saka kelas "njaba".

    Iki logis: mulane kita nggawe kelas Seatinternal HandleBar, supaya setir lan kursi sing ora duwe duweke ora katon ing kene ing program kita.

    Kode iki ora bakal dikompilasi:

    public static void main(String[] args) {
    
       HandleBar handleBar = new HandleBar();
    }

    Fitur penting ing ngisor iki saka iki:

  2. Obyek saka kelas njero nduweni akses menyang variabel kelas "njaba".

    Contone, ayo nambah Bicyclevariabel ing kelas kita int seatPostDiameter- diameteripun seatpost.

    Banjur ing kelas batin Seatkita bisa nggawe metode getSeatParam()sing bakal menehi kita parameter 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("Go!");
       }
    
       public class Seat {
    
           public void up() {
    
               System.out.println("The seat is up!");
           }
    
           public void down() {
    
               System.out.println("The seat is down!");
           }
    
           public void getSeatParam() {
    
               System.out.println("Seat parameter: seatpost diameter = " + Bicycle.this.seatPostDiameter);
           }
       }
    }

    Lan saiki kita bisa entuk 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.getSeatParam();
       }
    }

    Output konsol:

    
    Параметр сиденья: диаметр подседельного штыря = 40

    Pay manungsa waé:variabel anyar diumumake kanthi modifier paling ketat - private. Lan isih kelas njero nduweni akses!

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

    Iki diterangake kanthi fitur desain kelas internal. Kelas njero bisa duwe konstruktor kanthi paramèter utawa mung konstruktor standar. Nanging preduli iki, nalika kita nggawe obyek saka kelas utama, referensi kanggo obyek saka kelas "njaba" quietly liwati menyang. Sawise kabeh, anane obyek kasebut minangka prasyarat. Yen ora, kita ora bakal bisa nggawe obyek saka kelas njero.

    Nanging yen metode kelas njaba statis, obyek kelas njaba bisa uga ora ana! Iki tegese logika kelas batin bakal rusak. Ing kahanan kaya mengkono, 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 ing kene padha: metode statis lan variabel bisa ana lan diarani sanajan ora ana obyek.

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

    Kontradiksi sing jelas! Mulane, anane variabel statis lan metode ing kelas batin dilarang.

    Compiler bakal nggawe kesalahan nalika nyoba nggawe:

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

    Kelas njero bisa dilambangake kanthi modifier akses standar - public, private, protectedlan package private.

    Apa sebabe penting?

    Iki mengaruhi ngendi ing program kita bisa instantiate kelas batin.

    Yen kelas kita Seatdiumumake minangka public, kita bisa nggawe obyek ing kelas liyane. Syarat mung yaiku obyek saka kelas "eksternal" 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 ngakses kelas njero HandleBarsaka Main.

    Yen kita ngumumake kelas njero minangka private, kita mung bakal duwe akses kanggo nggawe obyek ing kelas "njaba".

    SeatKita ora bakal bisa nggawe obyek saka 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 a 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 kelas ing kelas turunane lan ing kelas sing ana ing paket sing padha.

    Padha protecteddianggo kanggo kelas batin. Objek protectedkelas njero bisa digawe:

    • nang kelas "njaba";
    • ing kelas turunane;
    • ing kelas sing ana ing paket sing padha.

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

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

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

Semono wae :) Nanging aja santai! Kelas bersarang internal minangka topik sing cukup wiyar sing bakal terus ditliti ing pelajaran sabanjure. Saiki sampeyan bisa ngrampungake kuliah babagan kelas internal saka kursus kita. Lan sabanjure kita bakal ngomong babagan kelas bersarang statis.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION