KodeGym/Blog Jawa/Acak/Conto warisan kelas nested
John Squirrels
tingkat
San Francisco

Conto warisan kelas nested

Diterbitake ing grup
Hi! Dina iki kita bakal nliti mekanisme penting: warisan ing kelas nested. Apa sampeyan tau mikir babagan apa sing bakal ditindakake yen sampeyan kudu nggawe kelas sing bersarang dadi warisan kelas liyane. Yen ora, pracaya kula: kahanan iki bisa mbingungake, amarga ana akeh nuansa.
  1. Apa kita nggawe kelas nested warisan sawetara kelas? Utawa kita nggawe sawetara kelas warisan kelas nested?
  2. Apa anak / wong tuwa kelas kelas umum biasa, utawa uga kelas nested?
  3. Pungkasan, apa jinis kelas nested sing digunakake ing kabeh kahanan kasebut?
Ana akeh jawaban kanggo kabeh pitakonan iki, sirahmu bakal muter :) Kaya sing sampeyan ngerteni, kita bisa ngatasi masalah sing rumit kanthi dibagi dadi bagean sing luwih gampang. Ayo ngono. Ayo kita nimbang saben klompok kelas nested ing siji saka rong perspektif: sing bisa oleh warisan saben jinis nested kelas, lan sing bisa oleh warisan. Ayo dadi miwiti karo kelas nested statis.

Kelas nested statis

Conto warisan kelas nested - 2Aturan warisan sing paling gampang. Ing kene sampeyan bisa nindakake meh kabeh sing dikarepake. Kelas bersarang statis bisa diwenehi warisan:
  • kelas biasa
  • kelas nested statis sing diumumake ing kelas njaba utawa leluhure
Elingi conto saka pawulangan babagan kelas bersarang statis.
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Ayo nyoba ngganti kode lan nggawe Drawingkelas nested statis lan turunane - Boeing737Drawing.
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }

   public static class Boeing737Drawing extends Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Nalika sampeyan bisa ndeleng, ora masalah. Kita malah bisa narik metu Drawingkelas lan nggawe kelas umum biasa tinimbang kelas nested statis - ora bakal ngganti.
public class Drawing {

}

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Boeing737Drawing extends Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Kita ngerti iki. Nanging kelas apa sing bisa marisi kelas nested statis? Praktis wae! Nested/non-nested, statis/non-statis — ora masalah. Ing kene kita nggawe Boeing737Drawingkelas njero marisi Drawingkelas nested statis:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }

   public class Boeing737Drawing extends Drawing {

       public int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Sampeyan bisa nggawe conto Boeing737Drawingkaya iki:
public class Main {

   public static void main(String[] args) {

      Boeing737 boeing737 = new Boeing737(1990);
      Boeing737.Boeing737Drawing drawing = boeing737.new Boeing737Drawing();
      System.out.println(drawing.getMaxPassengersCount());

   }

}
Senajan Boeing737Drawingkelas kita marisi kelas statis, iku ora statis dhewe! Akibaté, mesthi mbutuhake conto saka kelas njaba. Kita bisa mbusak Boeing737Drawingkelas saka Boeing737kelas lan nggawe kelas umum prasaja. Ora ana owah-owahan. Iku isih bisa oleh warisan Drawingkelas nested statis.
public class Boeing737 {

   private int manufactureYear;
   public static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }
}

public class Boeing737Drawing extends Boeing737.Drawing {

   public int getMaxPassengersCount() {

       return Boeing737.maxPassengersCount;

}
Siji-sijine titik penting yaiku yen ing kasus iki kita kudu nggawe maxPassengersCountpublik variabel statis. Yen tetep pribadi, kelas umum biasa ora bakal bisa ngakses. Kita wis ngerti kelas statis! :) Saiki ayo pindhah menyang kelas batin. Ana 3 jinis: kelas batin sing sederhana, kelas lokal, lan kelas njero anonim. Conto warisan kelas nested - 3Maneh, ayo pindhah saka prasaja menyang kompleks :)

Kelas batin anonim

Kelas batin anonim ora bisa marisi kelas liyane. Ora ana kelas liyane sing bisa marisi kelas anonim. Iku ora bisa dadi luwih prasaja! :)

Kelas lokal

Kelas lokal (yen sampeyan kelalen) diumumake ing blok kode kelas liyane. Paling asring, iki kedadeyan ing sawetara metode kelas njaba. Secara logis, mung kelas lokal liyane ing metode sing padha (utawa blok kode) sing bisa entuk warisan kelas lokal. Punika conto:
public class PhoneNumberValidator {

   public void validatePhoneNumber(final String number) {

       class PhoneNumber {

           private String phoneNumber;

           public PhoneNumber() {
               this.phoneNumber = number;
           }

           public String getPhoneNumber() {
               return phoneNumber;
           }

           public void setPhoneNumber(String phoneNumber) {
               this.phoneNumber = phoneNumber;
           }
       }

       class CellPhoneNumber extends PhoneNumber {

       }

       class LandlinePhoneNumber extends PhoneNumber {


       }

       // ...number validation code
   }
}
Iki kode saka pawulangan kita ing kelas lokal. Kelas validator nomer kita duwe PhoneNumberkelas lokal. Yen kita butuh kanggo makili rong entitas sing béda, contone, nomer ponsel lan nomer telpon darat, kita mung bisa nindakake iki ing cara sing padha. Alesané prasaja: ruang lingkup kelas lokal diwatesi karo metode (blok kode) sing diumumake. Akibaté, kita ora bakal bisa nggunakake externally (kalebu kanggo warisan kelas). Nanging, kemungkinan warisan ing kelas lokal dhewe luwih akeh! Kelas lokal bisa diwenehi warisan:
  1. Kelas biasa.
  2. Kelas batin sing diumumake ing kelas sing padha karo kelas lokal utawa ing salah sawijining leluhur.
  3. Kelas lokal liyane diumumake kanthi cara sing padha (blok kode).
Titik pisanan lan kaping telu katon jelas, nanging sing nomer loro rada mbingungake: / Coba deleng rong conto. Conto 1 - "Nggawe kelas lokal marisi kelas batin sing diumumake ing kelas sing padha karo kelas lokal":
public class PhoneNumberValidator {

   class PhoneNumber {

       private String phoneNumber;

       public PhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }

       public String getPhoneNumber() {
           return phoneNumber;
       }

       public void setPhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }
   }

   public void validatePhoneNumber(final String number) {

       class CellPhoneNumber extends PhoneNumber {

           public CellPhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       class LandlinePhoneNumber extends PhoneNumber {

           public LandlinePhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       // ...number validation code
   }
}
Ing kene kita mbusak PhoneNumberkelas saka validatePhoneNumber()metode kasebut lan nggawe kelas njero tinimbang kelas lokal. Iki ora ngalangi kita nggawe 2 kelas lokal dadi warisan. Tuladha 2 — "... utawa ing leluhur kelas iki." Saiki iki wis luwih menarik. Kita bisa pindhah PhoneNumberluwih dhuwur ing rantai pusaka. Ayo ngumumake AbstractPhoneNumberValidatorkelas abstrak, sing bakal dadi leluhur PhoneNumberValidatorkelas kita:
public abstract class AbstractPhoneNumberValidator {

   class PhoneNumber {

       private String phoneNumber;

       public PhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }

       public String getPhoneNumber() {
           return phoneNumber;
       }

       public void setPhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }
   }

}
Kaya sing sampeyan ngerteni, kita ora mung ngumumake - kita uga mindhah PhoneNumberkelas njero. Nanging, ing turunane PhoneNumberValidator, kelas lokal sing diumumake kanthi metode bisa entuk warisan PhoneNumbertanpa masalah!
public class PhoneNumberValidator extends AbstractPhoneNumberValidator {

   public void validatePhoneNumber(final String number) {

       class CellPhoneNumber extends PhoneNumber {

           public CellPhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       class LandlinePhoneNumber extends PhoneNumber {

           public LandlinePhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       // ...number validation code
   }
}
Amarga hubungan warisan, kelas lokal ing kelas turunan "ndeleng" kelas batin ing leluhur. Lan pungkasane, ayo nerusake menyang grup pungkasan :)

Kelas batin

Kelas batin sing diumumake ing kelas njaba sing padha (utawa ing turunane) bisa marisi kelas batin liyane. Ayo njelajah iki nggunakake conto kita karo sepeda saka pawulangan ing kelas batin.
public class Bicycle {

   private String model;
   private int maxWeight;

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

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

   class Seat {

       public void up() {

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

       public void down() {

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

   class SportSeat extends Seat {

       // ...methods
   }
}
Ing kene kita ngumumake Seatkelas batin ing njero Bicyclekelas. A jinis khusus saka jog racing, SportSeat, warisan iku. Nanging, kita bisa nggawe jinis "sepeda balap" sing kapisah lan dilebokake ing kelas sing kapisah:
public class SportBicycle extends Bicycle {

   public SportBicycle(String model, int maxWeight) {
       super(model, maxWeight);
   }


   class SportSeat extends Seat {

       public void up() {

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

       public void down() {

           System.out.println("Seat down!");
       }
   }
}
Iki uga pilihan. Golongan batin turunan ( SportBicycle.SportSeat) “ndeleng” golongan batine leluhur lan bisa oleh warisan. Warisan kelas batin nduweni fitur sing penting banget! Ing rong conto sadurunge, SportSeatkelas kita minangka kelas batin. Nanging kepiye yen kita mutusake nggawe SportSeatkelas umum biasa sing uga entuk warisan Seatkelas batin?
// Error! No enclosing instance of type 'Bicycle' is in scope
class SportSeat extends Bicycle.Seat {

   public SportSeat() {

   }

   public void up() {

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

   public void down() {

       System.out.println("Seat down!");
   }
}
Kita entuk kesalahan! Sampeyan bisa guess apa? :) Iku kabeh langsung. Nalika kita ngomong babagan Bicycle.Seatkelas njero, kita kasebut yen referensi kanggo conto saka kelas njaba sacara implisit liwati menyang konstruktor kelas njero. Iki tegese sampeyan ora bisa nggawe Seatobyek tanpa nggawe Bicycleobyek. Nanging apa bab nggawe a SportSeat? Boten kados Seat, iku ora duwe mekanisme dibangun ing iki kanggo implicitly maringaken konstruktor referensi kanggo Kayata saka kelas njaba. S nganti, tanpa Bicycleobyek, kita ora bisa nggawe SportSeatobyek, kaya ing kasus Seat. Mulane, mung ana siji bab sing kudu ditindakake - kanthi jelas ngirim SportSeatreferensi menyang konstruktor menyang Bicycleobyek. Mangkene carane nindakake:
class SportSeat extends Bicycle.Seat {

   public SportSeat(Bicycle bicycle) {

       bicycle.super();
   }

   public void up() {

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

   public void down() {

       System.out.println("Seat down!");
   }
}
Kita nelpon konstruktor superclass nggunakake super(); Saiki, yen kita pengin nggawe SportSeatobyek, ora ana sing bakal nyegah kita nindakake iki:
public class Main {

   public static void main(String[] args) {

       Bicycle bicycle = new Bicycle("Peugeot", 120);
       SportSeat peugeotSportSeat = new SportSeat(bicycle);

   }
}
Phew! Pawulangan iki rada suwe :) Nanging sampeyan sinau akeh! Saiki wektune kanggo ngrampungake sawetara tugas! :)
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar