Клас , які аб'яўляецца з дапамогай «абстрактнага» ключавога слова называюцца абстрактным класам. Ён можа мець абстрактныя метады (метады без цела), а таксама канкрэтныя метады (рэгулярныя метады з целам). Нармальны клас (не абстрактны клас) не можа мець абстрактныя метады. У гэтым кіраўніцтве мы даведаемся, што гэта абстрактны клас, таму мы выкарыстоўваем яго і якія правілы, якія мы павінны памятаць пры працы з ёй у Java.
Абстрактны клас не можа быць створаны, што азначае , што вы не можаце стварыць аб'ект гэтага. Чаму? Мы абмяркуем гэта пазней у гэтым кіраўніцтве.
Навошта нам патрэбны абстрактны клас?
Дапусцім , у нас ёсць клас Animal
, які мае метад sound()
і падкласы (гл ўспадкоўванне ) ад яго , як Dog
, Lion
, Horse
, Cat
і г.д. Так як гук жывёла адрозніваецца ад аднаго жывёльнага да іншага, няма ніякага сэнсу для рэалізацыі гэты метад у бацькоўскай класе. Гэта адбываецца таму , што кожны клас дзіця павінна перавызначыць гэты метад , каб даць свае ўласныя дэталі рэалізацыі, як Lion
клас будзе сказаць , «Роў» ў гэтым метадзе і Dog
клас будзе казаць "Гаў».
Таму, калі мы ведаем, што ўсе жывёла даччыных класы будуць і павінны перавызначыць гэты метад, то няма ніякага сэнсу рэалізоўваць гэты метад у бацькоўскай класе. Такім чынам, што робіць гэты метад анатацыі будзе добрым выбарам, як, робячы гэты метад абстрактна мы прымушаем усе класы суба рэалізаваць гэты метад (у адваротным выпадку вы атрымаеце памылку кампіляцыі), а таксама мы не павінны даваць якую-небудзь рэалізацыю да гэтага метаду ў бацькоўскай класе ,
Паколькі Animal
клас мае абстрактны метад, вы павінны неабходна абвясціць гэты клас абстрактным.
Цяпер кожнае жывёла павінна мець гук, робячы гэты метад абстрактна мы зрабілі яго абавязковым да класа дзіцяці, каб даць дэталі рэалізацыі да гэтага метаду. Такім чынам, мы гарантуем, што кожнае жывёла мае гук.
Абстрактны клас Прыклад
// абстрактны бацькоўскі клас абстрактны клас Animal {// абстрактны метадграмадскі абстрактны гук несапраўдным (); } // клас Dog пашырае клас жывёл грамадскі клас Dog пашырае Animal {грамадскага несапраўдны гук () { System.out.println ( "Гаў");}дзяржаўны статычны сіла асноўны (String Арг []) { Animal OBJ = новы Dog (); obj.sound ();} }
выхад:
гав
Таму для такога роду сцэнарыяў мы наогул абвясціць клас як абстрактныя і пазнейшыя канкрэтныя класы пашырыць гэтыя класы і перавызначаць метады , адпаведна , і могуць мець свае ўласныя метады.
Абстрактнае аб'яву класа
Абстрактны клас апісвае метады, але не абавязкова рэалізуе ўсе метады.
// Дэкларацыя з выкарыстаннем абстрактнага ключавога слова абстрактны клас А {// Гэта абстрактны метадабстрактная пустата MyMethod ();// Гэтае канкрэтны метад з целамanotherMethod несапраўднымі () { // нешта} }
правілы
Заўвага 1: Як мы бачылі ў прыведзеным вышэй прыкладзе, бываюць выпадкі , калі цяжка ці часта няма неабходнасці рэалізаваць усе метады бацькоўскага класа. У гэтых выпадках, мы можам аб'явіць бацькоўскі клас як абстрактны, што робіць яго асаблівым класам, які не з'яўляецца поўным само па сабе.
Клас, атрыманы з абстрактнага класа павінен рэалізоўваць усе тыя метады, якія абвяшчаюцца як абстрактныя ў бацькоўскай класе.
Заўвага 2: абстрактны клас не можа быць створана , які азначае , што вы не можаце стварыць аб'ект гэтага. Каб выкарыстоўваць гэты клас, вам трэба стварыць яшчэ адзін клас, які пашырае гэты гэты клас і забяспечвае рэалізацыю абстрактных метадаў, то вы можаце выкарыстоўваць аб'ект гэтага класа дзіцяці назваць неабстрактными метады бацькоўскага класа, а таксама рэалізаваны метадамі (тымі што былі абстрактнымі ў бацьку, але рэалізуецца ў даччыным класе).
Заўвага 3: Калі дзіця не рэалізуе ўсе абстрактныя метады абстрактнага бацькоўскага класа, то клас дзіця павінна павінны быць абвешчаны абстрактным , а таксама.
Ты ведаеш? Так як абстрактны клас дазваляе канкрэтныя метады, а таксама, ён не забяспечвае 100% абстракцыі. Можна сказаць, што яна забяспечвае частковую абстракцыю. Абстракцыя гэта працэс, у якім вы паказваеце толькі «адпаведныя» дадзеныя і «схаваць» непатрэбныя дэталі аб'екта ад карыстальніка.
Інтэрфейсы з другога боку , выкарыстоўваюцца на 100% абстракцыі (падрабязней аб абстракцыі тут).
Вы таксама можаце прачытаць: Розніца паміж абстрактным класам і інтэрфейсам у Java
Чаму мы не можам стварыць аб'ект абстрактнага класа?
Паколькі гэтыя класы з'яўляюцца няпоўнымі, яны маюць абстрактныя метады, якія не маюць ні цела, так што калі Java дазваляе стварыць аб'ект гэтага класа тады, калі хто-то называюць абстрактны метад, выкарыстоўваючы гэты аб'ект, то, што здарылася б? Там не будзе фактычнай рэалізацыі метады ў выклік.
Акрамя таго, паколькі аб'ект з'яўляецца бетон. Абстрактны класс як шаблон, так што вы павінны пашырыць і пабудаваць на ім, першым чым выкарыстоўваць яго.
Прыклад для дэманстрацыі таго, што стварэнне аб'екта абстрактнага класа не дапускаецца
Як ужо гаварылася вышэй, мы не можам стварыць асобнік абстрактнага класа. Гэтая праграма генеруе памылку кампіляцыі.
абстрактны класс AbstractDemo {грамадскага несапраўднае MyMethod () { System.out.println ( "Hello");}абстрактны грамадскія несапраўдны anotherMethod (); } грамадскі клас Demo пашырае AbstractDemo {грамадскага несапраўдны anotherMethod () { System.out.print ( "абстрактны метад"); }дзяржаўны статычны сіла асноўны (String Арг []){// памылка: Вы не можаце стварыць аб'ект гэтага AbstractDemo OBJ = новы AbstractDemo (); obj.anotherMethod ();} }
выхад:
Нявырашаныя праблемы кампіляцыі: Не атрымоўваецца стварыць асобнік тыпу AbstractDemo
Заўвага: Класс, які пашырае абстрактны клас, павінен рэалізаваць усе абстрактныя метады яго, інакш вы павінны абвясьціць, што клас анатацыю, а таксама.
Абстрактны клас супраць класа бетону
Клас , які не з'яўляецца абстрактным, называецца как бетон класа. У прыведзеным вышэй прыкладзе , які мы бачылі ў пачатку гэтага кіраўніцтва, Animal
з'яўляюцца абстрактным класам і Cat
, Dog
Lion
канкрэтных класаў.
Ключавыя моманты:
- Абстрактны клас не мае ніякай карысці, пакуль, калі не будзе працягнуты на нейкі іншы клас.
- Калі вы абвясьцеце абстрактны метад у класе , то вы павінны абвясьціць клас абстрактным , а таксама. вы не можаце мець абстрактны метад у канкрэтным класе. Гэта наадварот, не заўсёды дакладна: Калі клас, якія не маюць якой-небудзь абстрактны метад, то ён таксама можа быць пазначаны як абстрактныя.
- Ён можа мець не абстрактны метад (бетон), а таксама.
Я пакрываў правіла і прыклады абстрактных мэтадаў ў асобным кіраўніцтве, Вы можаце знайсці кіраўніцтва тут: абстрактны метад у Java
Цяпер давайце проста паглядзім некаторыя асновы і прыклад абстрактнага метаду.
1) Абстрактны метад не мае цела.
2) Заўсёды скончыць заяву кропкай з коскі (;).
3) Ён павінен быць перавызначаны . Абстрактны клас павінен быць пашыраны, і ў той жа чынам абстрактны метад павінен быць перавызначаны.
4) клас павінен быць абвешчаны абстрактным, каб мець абстрактныя метады.
Заўвага: клас , які пашырае абстрактны клас павінен перавызначыць усё абстрактныя метады.
Прыклад абстрактнага класа і метаду
абстрактны класс MyClass {грамадскага несапраўдны дисп () { System.out.println ( «Пэўны метад бацькоўскага класа»);}абстрактны грамадскі несапраўдныя DISP2 (); } клас Demo пашырае MyClass {/ * Неабходна перавызначыць гэты метад пры пашырэнні * MyClas * /грамадскага несапраўднымі DISP2 (){System.out.println ( "найважнейшы абстрактны метад");}дзяржаўны статычны сіла асноўны (String Арг []) {Дэманстрацыйны OBJ = новы дэманстрацыйны ();obj.disp2 ();} }
выхад:
найважнейшы абстрактны метад
да гэтага часу не зразумела, што практычная дастасавальнасць абстрактнага метаду. калі ласка, прапануйце мне.
Прывітанне Digbijay,
Абстрактны метад толькі подпіс без рэалізацыі блокавага метаду inside.Abstract павінны быць перавызначаны ў падклас, каб выкарыстоўваць для аб'екта для выкліку.
Абстрактны метад з'яўляецца толькі прататыпам метаду з наступнымі прыкметамі: -
1) Тып вяртаюць
2) Назва
3) пералік параметраў
4) пралівае становішча, якое з'яўляецца неабавязковым
Прыклад: - грамадская анатацыя Інта зарплата (ідэалам Empno)
Спадзяюся, што гэта дапамагае.
Ці можа абстрактны клас мае канструктар ????
і калі так, то чаму ???
і калі не, то чаму ???
Паважаны Суніл,
Няма !! таму што канструктар выклікаецца пры стварэнні аб'екта. але абстрактныя метады не мае асобніка так, што немагчыма назваць абстрактны канструктар.
Дарагі Хамід,
Я думаю, вы пераблыталі паняцце там трэба зрабіць карэкцыю ў нашым адказе.
Абстрактны клас можа мець канструктар. Нягледзячы на тое, што мы не можам асобнік абстрактнага класа канструктар па змаўчанні заўсёды ёсць. Альбо мы можам даць яго ў відавочным выглядзе або забяспечваецца Java. Прычына, чаму гэта там, таму што ў канцэпцыі ў спадчыну вы павінны падтрымліваць іерархію класаў, азначае, што калі ваш клас пашырае абстрактны класс, той жа абстрактны класс будзе супер класам для прасьціралася класа і памятаеце, калі ў вас ёсць канструктар вашага класа, то першы лінія канструктара заўсёды канструктар супер класа, і гэты час, калі ваш канструктар абстрактнага класа датэлефанаваўся
спадзяюся, што вы цяпер ясна!
Добры дзень Анкит Fulzele,
Ці можна стварыць асобнік абстрактнага класа?
Для мяне гэта, калі абстрактны клас атрыманы канкрэтны клас, які будзе выглядаць наступным чынам:
Ідэнтыфікатар = новы;
Ці правільна я?
Вялікі дзякуй,
знак
Пазней, калі мы ствараем аб'ект класа, прызначанага будзе няяўна выклікаць канструктар абстрактнага класа .. калі канструктар будзе называцца гэта значыць аб'ект гэтага класа павінны быць створаны?
Дарагі Хамід! На абстрактным клас можа мець канструктар, паколькі канструктары не выкарыстоўваюцца для стварэння аб'екта, канструктары выкарыстоўваюцца для ініцыялізацыі членаў дадзеных класа і абстрактнага класа можа таксама мець элемент дадзеных і для ініцыялізацыі элемента дадзеных абстрактнага класа патрэбен канструктар, калі мы зрабілі не апублікоўваць канструктар, то JVM паставіць 0-параметраў або канструктар па змаўчанні для ініцыялізацыі элемента дадзеных.
абстрактныя класы могуць мець constructors..though абстрактныя класы не могуць быць instantiated..that means..we не можа ствараць аб'екты абстрактнага class..but яшчэ абстрактны клас можа мець constructors..and гэты канструктар можна назваць падкласы (які ў спадчыну абстрактны клас), выкарыстоўваючы супер ключавое слова.
Вы можаце паспрабаваць апублікаваць кнігу вашага сайта пасля належнага прававога кансультавання.
Змест вельмі добра на вашым сайце.
як вы можаце атрымаць доступ канкрэтныя метады ў абстрактным класе, калі вы не можаце стварыць аб'ект абстрактнага класа. як у дадзеным прыкладзе, як я буду працаваць disp1 метад? якія змены варта зрабіць у кодзе?
Абстрактны клас можа мець канкрэтны метад, і так, мы не можам стварыць аб'ект, але калі вы разьзяўляеце ур абстрактны клас любой іншы клас, так праз ўспадкоўванне дзіцяці атрымаць усе метад (канкрэтны метад таксама бацькоўскага класа) тут дынамічны палімарфізм дасягаецца за кошт выкарыстання спасылак на бацька і можа выклікаць гэты канкрэтны метад бацькоўскага класа, і калі і не хочуць, што бацькоўскі метад проста перавызначыць канкрэтны метад гэтага бацькоўскага класа ў даччыным класе.
Удай, на жаль, вы не можаце атрымаць доступ да канкрэтных метадах абстрактнага класа, калі не пашырыць клас. Абстрактны клас фактычна амаль бескарысныя самі па сабе. Вы можаце ўбачыць абстрактны клас, як лянівы студэнт, які павінен быць сказана, каб чытаць яго кнігу; калі не атрымліваюць сказаў, што ён не зможа прачытаць яго кнігу. Распавядаючы студэнт цяпер аналагічна пашыраючы абстрактны клас і студэнт затым чытае яго кнігу, аналагічна выкананне канкрэтных метадаў, калі вам падабаецца.
Ці трэба нам ўвесці кастынг для абстрактнага класу?
чаму абаронены канструктары выкарыстоўваюцца ў абстрактным класе?
Чаму трэба абстрактны клас? Прыклад класа Animal быў дадзены тут. Але ці можа хто-то, калі ласка, дайце мне практычны прыклад, калі гэта карысна. Калі я пішу прыкладанне Java, калі я павінен спыніць пісаць усё Logica ў канкрэтным класе і пачаць выкарыстоўваць канцэпцыю абстрактнага класа