JavaRush /Java блогы /Random-KK /Нақты мысалдармен Java тіліндегі дерексіз сабақтар

Нақты мысалдармен Java тіліндегі дерексіз сабақтар

Топта жарияланған
Сәлеметсіз бе! Алдыңғы дәрістерде біз интерфейстермен танысып , олардың не үшін қажет екенін анықтадық. Бүгінгі тақырып алдыңғы тақырыппен ортақ нәрсе болады. Java тіліндегі абстрактілі сыныптар туралы сөйлесейік .Нақты мысалдармен Java тіліндегі дерексіз сабақтар - 1

Неліктен сабақтар «абстрактілі» деп аталады

Сіз «абстракция» дегеннің не екенін есте ұстаған шығарсыз - біз оны қарастырдық :) Егер сіз кенеттен ұмытып кетсеңіз, жақсы, есте сақтаңыз: бұл OOP принципі , оған сәйкес сыныптарды жобалау және an objectілерді құру кезінде бөлектеу қажет. нысанның тек негізгі қасиеттерін ғана алып, қосалқыларын алып тастаңыз. Мысалы, егер біз сыныпты - мектеп мұғалімін жобаласақ , бізге « биіктік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және оның дерексіз емес әдістері болды. Бірақ бұл шешімнің бірқатар кемшіліктері бар, олар абстрактілі сабақтарда түзетіледі. Ең алдымен, абстрактілі класс данасын жасау мүмкін емес:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Бұл «трюкті» арнайы Java жасаушылар жүзеге асырған. Тағы бір рет еске түсірейік: абстрактілі сынып - бұл болашақ «қалыпты» сыныптардың жоспары . Сізге сызбаның көшірмелері қажет емес, солай ма? Сондықтан абстрактілі класс данасын жасаудың қажеті жоқ :) Ал егер класс Carдерексіз болмаса, біз оның нысандарын оңай жасай аламыз:
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
   }
}
Енді біздің бағдарламамызда түсініксіз көлік түрі бар - жүк көлігі емес, жарыс көлігі емес, седан емес, жалпы бір нәрсе. Табиғатта жоқ дәл сол «жай машина». Дәл осындай мысалды жануарларға да келтіруге болады. Сіздің бағдарламаңызда нысандар пайда болғанын елестетіп көріңіз Animal- « жай жануар ». Оның қандай түрі, қандай тұқымдасқа жататыны, қандай қасиеттері бар екені белгісіз. Оны бағдарламада көру біртүрлі болар еді. Табиғатта «жай жануарлар» жоқ. Тек иттер, мысықтар, түлкілер, меңдер және т.б. Абстрактілі сабақтар бізді « жай an objectілерден » босатады . Олар бізге негізгі күй мен мінез-құлық береді. Мысалы, барлық автомобильдердің моделі , түсі және максималды жылдамдығы болуы керек, сонымен қатар оларда газ және тежегіш болуы керек . Осымен болды. Бұл жалпы дерексіз схема, содан кейін өзіңізге қажетті сабақтарды өзіңіз құрастырасыз. Назар аударыңыз: абстрактілі сыныптағы екі әдіс де абстракт ретінде белгіленеді және олар мүлде орындалмайды. Себебі бірдей: дерексіз сыныптар «жай машиналар» үшін «әдепкі мінез-құлық» жасамайды. Олар тек барлық көліктерді жасай алу керек дейді. Дегенмен, әдепкі әрекет әлі де қажет болса, әдістерді дерексіз сыныпта енгізуге болады. Java бұған тыйым салмайды:
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. Бұл өте ыңғайлы және икемді болып шықты. Бірақ қазір біздің сынып соншалықты абстрактілі емес пе ? Өйткені, шын мәнінде, оның әдістерінің жартысы жүзеге асырылады. Шын мәнінде - бұл өте маңызды қасиет - класс абстрактілі, егер оның әдістерінің кем дегенде біреуі абстрактілі болса . Кем дегенде екінің бірі, кем дегенде мың әдістің бірі - бұл маңызды емес. Біз тіпті барлық әдістерді жүзеге асыра аламыз және ешбір дерексізді қалдырмаймыз. Абстрактілі әдістерсіз абстрактілі класс болады. Негізінде, бұл мүмкін және компилятор қателер шығармайды, бірақ бұлай жасамағаныңыз жөн: абстракт сөзі мағынасын жоғалтады және сіздің бағдарламашы әріптестеріңіз мұны көргенде қатты таң қалады:/ Оның үстіне, егер әдіс абстракт сөзімен белгіленеді, әрбір ұрпақ класы жүзеге асуы немесе абстрактілі деп жариялануы керек. Әйтпесе, компилятор қате жібереді . Әрине, әрбір класс тек бір абстрактілі сыныптан мұра алады, сондықтан тұқым қуалау тұрғысынан абстрактілі және кәдімгі класстардың арасында ешқандай айырмашылық жоқ. Біз абстрактілі сыныптан немесе кәдімгі сыныптан мұра алғанымыз маңызды емес, тек бір ата-аналық сынып болуы мүмкін.

Неліктен 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?
   }
}
Не алғанымызды көрейік. Жұмбақ құрылғы тостерден де, ядролық бомбадан да келеді. Екеуінің де әдісі бар on(), нәтижесінде on()an objectіні MysteriousDeviceатасақ, қай әдісті ату керек екені белгісіз. Нысан мұны түсіне алмайды. Торттағы шие сияқты: Ядролық бомбаның әдісі жоқ off(), сондықтан егер біз қате тапсақ, құрылғыны өшіруге мүмкіндік болмайды. Нақты мысалдармен Java тіліндегі дерексіз сабақтар – 2 Дәл осы шатасудың салдарынан, an object қандай мінез-құлықты таңдауы керек екені анық болмаған кезде, Java жасаушылар бірнеше мұрадан бас тартты. Дегенмен, Java сыныптары көптеген интерфейстерді жүзеге асыратыны есіңізде. Айтпақшы, сіз оқуыңызда кем дегенде бір реферат сабағын кездестірдіңіз! Дегенмен, мен оны байқамаған шығармын :)
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