JavaRush /Java блогу /Random-KY /конкреттүү мисалдар менен Java абстракттуу класстар

конкреттүү мисалдар менен Java абстракттуу класстар

Группада жарыяланган
Салам! Мурунку лекцияларда биз интерфейстер менен таанышып , алар эмне үчүн керек экенин түшүндүк. Бүгүнкү теманын мурунку тема менен жалпылыгы болот. Келгиле, Java тorндеги абстракттуу класстар жөнүндө сүйлөшөлү.Java тorндеги абстракттуу класстар конкреттүү мисалдар менен - ​​1

Эмне үчүн класстар "абстракттуу" деп аталат

Сиз "абстракция" деген эмне экенин эсиңизде болсо керек - биз буга чейин эле жаап салганбыз :) Эгер сиз күтүлбөгөн жерден унутуп калсаңыз, анда жакшы, эсиңизде болсун: бул OOP принциби , ага ылайык класстарды долбоорлоодо жана an objectтерди түзүүдө an objectтин негизги касиеттерин гана бөлүп, экинчorктерин жокко чыгарыңыз. Мисалы, эгерде биз классты - мектеп мугалимин долбоорлосок , анда бизге " бийиктикSchoolTeacher " өзгөчөлүгү керек эмес . Чынында эле: мугалим үчүн бул өзгөчөлүк маанилүү эмес. Бирок программада класс түзсөк – баскетболчу – бийиктиги негизги мүнөздөмөлөрдүн бирине айланат. Ошентип, абстракттуу класс - бул келечектеги класстардын тобу үчүн эң абстракттуу, болжолдуу "бош". Бул даярдоо анын даяр түрүндө колдонулушу мүмкүн эмес - бул өтө "чийки" болуп саналат. Бирок ал келечектеги класстар – абстрактуу класстын мураскорлору ээ боло турган белгилүү бир жалпы абалды жана жүрүм-турумду сүрөттөйт. BasketballPlayer

Java абстракттуу класстын мисалдары

Келгиле, унаалар менен жөнөкөй мисалды карап көрөлү:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
Бул эң жөнөкөй абстракттуу класстын көрүнүшү. Көрүнүп тургандай, өзгөчө эч нерсе жок :) Бул бизге эмне үчүн керек болушу мүмкүн? Биринчиден, ал бизге эң абстракттуу түрдө керек болгон нерсени – машинаны сүрөттөйт. Абстракт деген сөздүн бул жерде бир себеби бар. Дүйнөдө "жөн эле машиналар" жок. Жүк ташуучу унаалар, жарыш машиналары, седандар, купелер, жол тандабастар бар. Биздин абстракттуу классыбыз жөн гана "схема" болуп саналат, андан кийин биз унаа класстарын түзөбүз.
public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan accelerates!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}
Бул биз мурас жөнүндө лекцияларда айткан нерселерге окшош. Ал жерде гана бизде класс Carжана анын абстракттуу эмес методдору бар болчу. Бирок бул чечим абстрактуу класстарда оңдолуп, бир катар кемчorктерге ээ. Биринчиден, абстракттуу класстын үлгүсүн түзүү мүмкүн эмес:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Бул "трюк" атайын Java түзүүчүлөрү тарабынан ишке ашырылган. Дагы бир жолу эсиңизде болсун: абстракттуу класс - бул келечектеги "нормалдуу" класстар үчүн план . Сизге чийменин көчүрмөлөрү керек эмес, туурабы? Демек, абстракттуу класстын инстанцияларын түзүүнүн кереги жок :) Ал эми класс Carабстракттуу болбосо, биз анын an objectтерин оңой эле түзө алмакпыз:
public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // some logic
   }

   public  void brake() {
       // some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is OK, the machine has been created
   }
}
Эми биздин программада кандайдыр бир түшүнүксүз машина бар – жүк ташуучу унаа эмес, жарыш унаасы эмес, седан эмес, жалпысынан бир нерсе. Ошол эле «жөн эле машина» табиятта жок. Ушундай эле мисалды жаныбарларга да келтирүүгө болот. Сиздин программаңызда an objectтер пайда болгонун элестетиңиз Animal- " жөн эле жаныбар ". Анын кандай түрү, кайсы үй-бүлөгө таандык, кандай өзгөчөлүктөргө ээ экендиги белгисиз. Аны программада көрүү кызык болор эле. Жаратылышта "жөн эле жаныбарлар" жок. Болгону ит, мышык, түлкү, мең жана башкалар. Абстракттуу класстар бизди “ жөн эле an objectтерден ” бошотот . Алар бизге негизги абалды жана жүрүм-турумду берет. Мисалы, бардык унаалардын модели , түсү жана максималдуу ылдамдыгы болушу керек, ошондой эле алар газ жана тормозду кармай бorши керек . Баары болду. Бул жалпы абстракттуу схема, анда сизге керектүү класстарды өзүңүз иштеп чыгасыз. Сураныч, көңүл буруңуз: абстракттуу класстагы эки ыкма абстракттуу деп да белгиленет жана алар такыр ишке ашырылbyte. Себеби бир эле: абстрактуу класстар "жөн эле машиналар" үчүн "демейки жүрүм-турумду" түзбөйт. Болгону алар бардык машиналарды жасай алышыбыз керек дешет. Бирок, эгер сизге дагы эле демейки жүрүм-турум керек болсо, абстракттуу класста методдорду ишке ашыра аласыз. Java буга тыюу салbyte:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

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

   public abstract void brake();

   //getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Консолдун чыгышы: "Тездеңиз!" Көрүнүп тургандай, биз абстракттуу класста бир методду ишке ашырдык, бирок экинчисин ишке ашырган жокпуз. Натыйжада, биздин класстын жүрүм-туруму Sedanэки бөлүккө бөлүндү: эгер сиз ага методду чакырсаңыз gas(), ал ата-энелик абстракттуу класстан "жогорулат" Carжана brake()биз класста методду кайра аныктадык Sedan. Бул абдан ыңгайлуу жана ийкемдүү болуп чыкты. Бирок азыр биздин класс анчалык абстракттуу эмеспи ? Анткени, чындыгында анын методдорунун жарымы ишке ашат. Чынында - бул абдан маанилүү өзгөчөлүк - класс абстракттуу, эгерде анын методдорунун жок дегенде бири абстрактуу болсо . Жок дегенде эки, жок дегенде миң ыкманын бири - бул маанилүү эмес. Жада калса бардык ыкмаларды ишке ашыра алабыз, абстракттууларды калтырбайбыз. Абстракттуу методдорсуз абстракттуу класс болот. Негизи, бул мүмкүн, жана компилятор каталарды чыгарbyte, бирок муну кылбай эле койгон оң: абстракт деген сөз маанисин жоготот жана сиздин кесиптештериңиз муну көрүп абдан таң калышат :/ Мындан тышкары, эгерде метод абстрактуу деген сөз менен белгиленген, ар бир тукум класс ишке ашырууга же абстракттуу деп жарыяланышы керек. Болбосо компилятор ката кетирет . Албетте, ар бир класс бир гана абстракттуу класстан мурас ала алат, андыктан тукум куучулук жагынан абстрактуу класстар менен кадимки класстардын ортосунда эч кандай айырма жок. Биз абстракттуу класстан же кадимки класстан мураска алганыбыз маанилүү эмес, бир гана ата-эне класс болушу мүмкүн.

Эмне үчүн Javaда бир нече класс мурасы жок?

Биз буга чейин Java-да көп тукум куучулук жок деп айтканбыз, бирок мунун себебин түшүнө элекпиз. Келгиле, муну азыр аракет кылып көрөлү. Кептин себеби, эгер Java бир нече мураска ээ болсо, бала класстар кайсы жүрүм-турумду тандоону чече алышпайт. Бизде эки класс бар дейли - Tosterжана NuclearBomb:
public class Toster {


 public void on() {

       System.out.println("The toaster is on, the toast is getting ready!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Взрыв!");
   }
}
Көрүнүп тургандай, экөөнүн тең ыкмасы бар on(). Тостерде тост бышырып баштайт, ал эми ядролук бомба болсо жарылууну пайда кылат. О :/ Эми сиз ортодо бир нерсе түзүүнү чечкениңизди элестетиңиз (эмне үчүн күтүлбөгөн жерден билбейм!). Ал эми бул сенин класс - MysteriousDevice! Бул code, албетте, иштебейт жана биз аны "кандай болушу мүмкүн" деген мисал катары келтиребиз:
public class MysteriousDevice extends Toster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // And what should happen here? Will we get a toast, or a nuclear apocalypse?
   }
}
Келгиле, эмне бар экенин карап көрөлү. Табышмактуу аппарат Тостерден да, өзөктүк бомбадан да келет. Экөөнүн тең методу бар , натыйжада, эгер биз аны чакырсак, an objectке on()кайсы ыкманы аткылоо керектиги белгисиз . Объект муну түшүнө алbyte. Мейли, торттогу гилас катары: Ядролук бомбанын ыкмасы жок , андыктан биз туура эмес ойлосок, аппаратты өчүрүүгө эч кандай жол жок. Дал ушул башаламандыктан, an object кайсы жүрүм-турумду тандашы керектиги так болбосо, Java түзүүчүлөрү бир нече мурастан баш тартышкан. Бирок, Java класстары көптөгөн интерфейстерди ишке ашыраарын эстейсиз. Айтмакчы, сиз окууңузда жок дегенде бир абстракттуу класска туш болдуңуз! Бирок, балким, мен аны байкаган жокмун :) on()MysteriousDeviceoff()Java тorндеги абстракттуу класстар конкреттүү мисалдар менен - ​​2
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Бул сенин эски досуң Calendar. Бул абстракттуу жана бир нече мураскорлору бар. Алардын бири болуп саналат GregorianCalendar. Сиз аны даталар тууралуу сабактарда колдонгонсуз :) Баары түшүнүктүү окшойт, бир гана пункт калды: абстракттуу класстар менен интерфейстердин принципиалдуу айырмасы эмнеде ? Эмне үчүн алар экөөнү тең Javaга кошуп, бирөө менен чектелбей коюшту? Бул жетиштүү болушу мүмкүн. Бул тууралуу кийинки лекцияда сүйлөшөбүз! Көрүшкөнчө:)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION