JavaRush /Java Blog /Random-TK /Höwürtge synplarynyň mirasy

Höwürtge synplarynyň mirasy

Toparda çap edildi
Salam! Bu gün möhüm bir mehanizmiň işleýşine serederis - höwürtgelenen synplarda miras. Başga birinden höwürtgelenen synpy miras almaly bolanyňyzda näme etjekdigiňizi pikir edip görendigiňizi bilemok. Notok bolsa, maňa ynan: bu ýagdaý bulaşyk bolup biler, sebäbi bu ýerde köp nuans bar:
  1. Haýsydyr bir synpdan höwürtgelenen synpy miras alýarysmy ýa-da höwürtgeden başga bir synpy miras alýarysmy?
  2. Mirasdar / adaty jemgyýetçilik synpyny miras alýarmy ýa-da höwürtgelenen synpmy?
  3. Ahyrynda, bu ýagdaýlaryň hemmesinde höwürtgelenen synplaryň haýsy görnüşini ulanýarys?
Bu soraglaryň hemmesine jogap berseňiz, kelläňiz aýlanar ýaly köp jogap bolar :) Bilşiňiz ýaly, çylşyrymly meseläni çözmek üçin ony has ýönekeý böleklere bölmeli. Ine, biz ederis. Höweslendirilen synplaryň her toparyna öz gezeginde iki nukdaýnazardan seredeliň: bu höwürtge synpyndan kim miras alyp biler we kimden miras alyp biler. Statiki öýjükli sapaklardan başlalyň.

Statik höwürtge synplary

Içerki synplaryň mirasyna mysallar - 2Miras düzgünleri iň ýönekeýidir. Bu ýerde ýüregiňiziň islän zadyny edip bilersiňiz. Statik höwürtge synpyndan miras alyp bolar:
  • yzygiderli synp
  • daşarky synpda ýa-da ata-babalarynda yglan edilen statiki höwürtge synpy
Statik höwürtge synplary baradaky leksiýadan mysaly ýada salalyň.
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;
       }
   }
}
DrawingKody üýtgetmäge we statiki höwürtge synpyny we onuň neslini döretmäge synanyşalyň - 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;
       }
   }
}
Görşüňiz ýaly, mesele ýok. Synpy düýbünden aýyryp Drawing, statiki höwürtgäniň ýerine adaty jemgyýetçilik synpyna öwrüp bileris - hiç zat üýtgemez.
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;
       }
   }
}
Bu düzüldi. Statik höwürtgeden haýsy synplar miras alyp biler? Her niçigem bolsa diýen ýaly! Höwürtge / yzygiderli, statik / statik däl - tapawudy ýok. Bu ýerde içerki synpy Boeing737Drawingstatiki höwürtgeden miras alýarys 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 Drawing {

   }

   public class Boeing737Drawing extends Drawing {

       public int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Boeing737DrawingMunuň ýaly mysal döredip bilersiňiz:
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());

   }

}
Biziň synpymyz Boeing737Drawingstatik synpdan miras alsa-da, özi statik däl! Şonuň üçin oňa hemişe daşarky synpyň mysaly gerek bolar. Boeing737DrawingSynpy synpdan çykaryp Boeing737, ony diňe umumy synp edip bileris . Hiç zat üýtgemez - statiki höwürtgeden hem miras alyp biler Drawing.
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;

}
Importanteke-täk möhüm nokat: bu ýagdaýda statiki üýtgeýänleri köpçülige ýetirmeli maxPassengersCount. Şahsy görnüşde galsa, adaty jemgyýetçilik synpy oňa girip bilmez. Statik synplary düzdük! :) Indi içerki synplara geçeliň. .Adyňyzda bolsa, olaryň 3 görnüşi bar: diňe içki synplar, ýerli synplar we näbelli içki synplar. Içerki synplaryň mirasyna mysallar - 3Againene-de ýönekeýden çylşyrymlylyga geçeliň :)

Anonim içki synplar

Anonim içki synp başga bir synpdan miras alyp bilmez. Başga hiç bir synp näbelli synpdan miras alyp bilmez. Has ýönekeý bolup bilmez! :)

Classeserli synplar

Classeserli synplar (ýatdan çykaran bolsaňyz) başga bir synpyň kod blokynyň içinde yglan edilýär. Köplenç - bu daşarky synpyň käbir usulynyň içinde. Diňe şol bir usuldaky (ýa-da blok) beýleki ýerli synplaryň ýerli synpdan miras alyp biljekdigi mantykly. Ine bir mysal:
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 {


       }

       //...code валидации номера
   }
}
Bu ýerli synplar baradaky leksiýamyzdaky kod. San tassyklaýjy synpyň içinde ýerli synp - telefon belgisi bar PhoneNumber. Maksatlarymyz üçin ondan iki aýry guramany çykarmaly bolsak, mysal üçin jübi telefonynyň belgisi we ýerüsti telefon belgisi, muny diňe şol bir usulda edip bileris. Sebäbi ýönekeý: ýerli synpyň gerimi yglan edilen usulda (blokda). Şonuň üçin ony nädip daşardan ulanyp bilmeris (miras üçin hem). Şeýle-de bolsa, ýerli synpyň özi miras almak üçin has giň mümkinçiliklere eýe! Classerli synp miras alyp biler:
  1. Adaty synp.
  2. Classerli synp ýa-da ata-babalary bilen bir synpda yglan edilen içki synp.
  3. Şol usulda (blok) yglan edilen başga bir ýerli synpdan.
Birinji we üçünji nokatlar düşnükli görünýär, ýöne ikinjisi birneme bulaşyk: / Geliň, iki mysala seredeliň. Mysal 1 - “ýerli synp bilen bir synpda yglan edilen içki synpdan ýerli synpy miras almak”:
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);
           }
       }

       //...code валидации номера
   }
}
PhoneNumberBu ýerde synpy usuldan çykardyk validatePhoneNumber()we ýerli däl-de, içerki etdik. Bu, 2 ýerli synpymyzy ondan miras almagymyza päsgel bermeýär. Mysal 2 - “... ýa-da bu synpyň ata-babalarynda.” Bu ýerde has gyzykly bolýar. PhoneNumberMiras zynjyryny hasam ýokary edip bileris . AbstractPhoneNumberValidatorGeliň, biziň atamyz boljak abstrakt synpy yglan edeliň PhoneNumberValidator:
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;
       }
   }

}
Görşüňiz ýaly, biz diňe bir yglan etmän, içerki synpy hem oňa geçirdik PhoneNumber. Şeýle-de bolsa, onuň nesil synpynda - PhoneNumberValidator- usullar boýunça ýerli synplar miras alyp biler PhoneNumber!
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);
           }
       }

       //...code валидации номера
   }
}
Miras arkaly baglanyşyk sebäpli, nesil synpynyň içindäki ýerli synplar ata-babalaryň içindäki içki synplary “görýärler”. Iň soňunda bolsa, soňky topara geçeliň :)

Içerki synplar

Içerki synpy şol bir daşarky synpda (ýa-da onuň nesli) yglan edilen başga bir içki synp miras alyp biler. Içerki synplardaky leksiýadan welosiped mysalymyzy ulanyp, muňa seredeliň.
public class Bicycle {

   private String model;
   private int mawWeight;

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

   public void start() {
       System.out.println("Go!");
   }

   class Seat {

       public void up() {

           System.out.println("Сидение поднято выше!");
       }

       public void down() {

           System.out.println("Сидение опущено ниже!");
       }
   }

   class SportSeat extends Seat {

       //...methods
   }
}
Bu ýerde synpyň içindäki Bicycleoturgyç Seat- oturgyç yglan etdik. Ondan ýaryş oturgyçlarynyň ýörite görnüşi miras galypdy - SportSeat. Şeýle-de bolsa, “ýaryş tigirleriniň” aýratyn görnüşini döredip, ony aýratyn klasa goýup bilerdik:
public class SportBicycle extends Bicycle {

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


   class SportSeat extends Seat {

       public void up() {

           System.out.println("Сидение поднято выше!");
       }

       public void down() {

           System.out.println("Сидение опущено ниже!");
       }
   }
}
Bu hem mümkindir. Çaganyň içki synpy ( SportBicycle.SportSeat) ata-babanyň içki synplaryny “görýär” we olardan miras alyp biler. Içerki synplardan miras almak gaty möhüm bir aýratynlyga eýe! Öňki iki mysalda içimiz SportSeatbardy. SportSeatItöne içerki synpdan miras galan adaty köpçülige öwürmek kararyna gelsek näme etmeli Seat?
//ошибка! No inclosing instance of  type 'Bicycle' is in scope
class SportSeat extends Bicycle.Seat {

   public SportSeat() {

   }

   public void up() {

       System.out.println("Сидение поднято выше!");
   }

   public void down() {

       System.out.println("Сидение опущено ниже!");
   }
}
Erroralňyşlyk aldyk! Munuň bilen baglanyşyklydygyny çaklap bilersiňizmi? :) Bu ýönekeý. Içki synp hakda aýdanymyzda Bicycle.Seat, içki synpyň konstruktorynyň daşarky synpyň obýektine salgylanmany aç-açan geçirýändigini aýtdyk. Şonuň üçin bir obýekt döretmezden Bicyclebir obýekt döredip bilmersiňiz Seat. Creationaradylmak hakda näme SportSeat? Konstruktordaky daşarky synp obýektine salgylanmany aç-açan geçirmek üçin gurlan mehanizmi ýok Seat. Şeýle-de bolsa, bir obýekt bolmasa Bicycle, edil bolşy ýaly Seat, obýekt döredip bilmeris SportSeat. Şonuň üçin biziň etmeli ýekeje zadymyz galdy - SportSeatobýektiň salgylanmasyny Bicycleaç-açan konstruktora geçiriň. Ine, bu nähili edildi:
class SportSeat extends Bicycle.Seat {

   public SportSeat(Bicycle bicycle) {

       bicycle.super();
   }

   public void up() {

       System.out.println("Сидение поднято выше!");
   }

   public void down() {

       System.out.println("Сидение опущено ниже!");
   }
}
Munuň üçin indi ýörite söz ulanýarys super(); , eger bir obýekt döretmek islesek SportSeat, hiç zat muny etmegimize päsgel bermez:
public class Main {

   public static void main(String[] args) {

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

   }
}
Phew, leksiýa gaty uly boldy :) youöne köp täze zatlar öwrendiň! Indi birnäçe meseläni çözmegiň wagty geldi! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION