what is abstraction java learn with examples
Tento kurz vysvětluje, co je Abstraction in Java, spolu s příklady programování. Dozvíte se také, co je abstraktní třída a proč se používá:
V této sérii JAVA probereme důležité funkce objektově orientovaného programování (OOP), které jsou známé také jako čtyři pilíře, tj. Abstrakce, Zapouzdření, Dědičnost a Polymorfismus.
Prvním pilířem OOP je „Abstrakce“. 'Abstrakce je proces výběru dat, aby se uživateli zobrazovaly pouze relevantní informace.'
=> Prohlédněte si příručku Java Beginners Guide zde.
Co se naučíte:
Abstrakce v OOP
Jednoduše řečeno, abstrakce „zobrazuje“ pouze relevantní atributy objektů a „skrývá“ zbytečné podrobnosti.
Například, když řídíme auto, zajímáme se pouze o řízení automobilu, jako je start / stop auto, zrychlení / rozbití atd. Nejde nám o to, jak vlastní mechanismus start / stop nebo akcelerace / brzda funguje interně. Tyto podrobnosti nás prostě nezajímají.
Znepokojuje nás „abstraktní“ pohled na tyto operace, který nám pomůže pohánět auto dopředu a dosáhnout cíle. Toto je jednoduchý příklad abstrakce.
Auto tedy má všechny mechanismy a procesy zavedené, ale z pohledu koncového uživatele, tj. Z pohledu řidiče automobilu, se bude zajímat pouze o abstraktní pohled na tyto procesy.
Abstrakce snižuje programovací úsilí a tím i složitost. Koncový uživatel používající aplikaci se nemusí obávat, jak je konkrétní funkce implementována. Může používat funkce podle potřeby.
V abstrakci se tedy zabýváme myšlenkami, nikoli událostmi. To znamená, že před uživatelem skryjeme podrobnosti implementace a koncovému uživateli vystavíme pouze funkce. Uživatel tak bude vědět jen „co dělá“, nikoli „jak to dělá“.
Abstrakce v OOP může být dvou typů.
# 1) Abstrakce dat
V datové abstrakci většinou vytváříme složité datové typy a skrýváme jejich implementaci. Pouze vystavíme operace, které manipulují s těmito datovými typy, aniž bychom šli do podrobností o jejich implementaci.
Jednou z výhod tohoto přístupu je, že můžeme implementaci kdykoli změnit, aniž bychom změnili chování, které je uživateli vystaveno.
# 2) Ovládejte abstrakci
Control abstraction shromažďuje všechny ovládací příkazy, které jsou součástí aplikace, a vystavuje je jako jednotku. Tato funkce se používá, když musíme pomocí této řídicí jednotky provést pracovní funkci.
Řídicí abstrakce tvoří hlavní jednotku strukturovaného programování a pomocí řídicí abstrakce můžeme definovat jednoduché funkce až po složité rámce.
Co je to abstrakce v Javě
Protože Java je jazyk OOP, lze na abstrakci pohlížet jako na jednu z důležitých vlastností a stavebních kamenů jazyka Java. V Javě je abstrakce implementována pomocí abstraktní třídy a rozhraní.
Jak tedy implementujeme abstrakci v Javě? Java poskytuje modifikátor nepřístupu „abstrakt“ pro implementaci abstrakce. Tento abstraktní modifikátor lze použít s třídami a metodami, ale ne s proměnnými.
Rozhraní poskytuje úplnou abstrakci, tj. Poskytuje pouze prototypy metod, nikoli jejich implementaci. Abstraktní třída poskytuje částečnou abstrakci, při které by neměla být implementována alespoň jedna metoda.
V tomto kurzu budeme podrobně diskutovat o abstrakci s abstraktními třídami. Rozhraní podrobně prozkoumáme v našich dalších výukách.
Příklad Java Abstrakce
Uvažujme níže uvedený příklad.
//abstract class abstract class Car{ abstract void accelerate(); } //concrete class class Suzuki extends Car{ void accelerate(){ System.out.println('Suzuki::accelerate'); } } class Main{ public static void main(String args()){ Car obj = new Suzuki(); //Car object =>contents of Suzuki obj.accelerate(); //call the method } }
Výstup:
Jednoduchý příklad abstrakce, který je uveden výše, má třídu Car. V této třídě Car máme abstraktní metodu accelerate (). Potom tuto třídu zdědíme ve třídě Suzuki. Uvnitř třídy Suzuki implementujeme metodu akcelerace.
Výše uvedený příklad jednoduše ukazuje způsob, jakým je abstraktní třída definována, zděděna a poté použita v programu.
Co je Java Abstract Class
Již jsme zmínili, že Java implementuje abstrakci pomocí abstraktních tříd a rozhraní. Pojďme nejprve prozkoumat vše o abstraktní třídě.
Abstraktní třídu lze definovat jako třídu deklarovanou pomocí klíčového slova „abstraktní“ a má omezení, že ji nelze vytvořit.
Abstraktní třída může nebo nemusí mít žádnou abstraktní metodu (metoda bez implementace). Pokud jde o JVM, abstraktní třída je neúplná třída, která nemá úplné chování.
Obecná syntaxe abstraktní třídy je uvedena níže:
abstract class { public abstract void abstractMethod(); public void normalMethod() { //method body } }
Jak je znázorněno v syntaxi výše uvedené abstraktní třídy, v abstraktní třídě můžeme mít abstraktní i neabstrahové metody. Deklaraci třídy předchází klíčové slovo „abstrakt“.
Stručně řečeno, abstraktní třídu lze popsat, jak je znázorněno níže.
Abstraktní metoda v Javě
Abstraktní metoda je metoda, které předchází klíčové slovo „abstract“ bez jakékoli implementace. Abstraktní metoda je deklarována uvnitř abstraktní třídy.
Abstraktní metoda je metoda, díky které je třída neúplná, protože nemá implementaci. Když tedy do třídy zařadíme abstraktní metodu, třída se přirozeně stane neúplnou.
model vodopádu životního cyklu vývoje softwaru
Můžeme použít abstraktní metodu implementací do podtřídy, tj. Třída zdědí abstraktní třídu a poté implementuje nebo poskytne kód pro všechny abstraktní metody deklarované v abstraktní třídě jejich přepsáním.
Proto je povinné přepsat abstraktní metodu v podtřídě. Pokud není abstraktní metoda implementována také v podtřídě, pak musíme podtřídu deklarovat také jako „abstraktní“.
Obecná deklarace abstraktní metody je:
abstraktní prázdnota methodName (seznam_parametrů);
Při psaní abstraktní metody si musíme pamatovat následující pravidla:
- Třída obsahující jednu nebo více abstraktních metod je abstraktní třída.
- Některá další klíčová slova by se neměla používat s abstraktním klíčovým slovem.
Následující kombinace jsou tedy v Javě nelegální.
- finále
- abstraktní rodák
- abstraktní statické
- abstraktní soukromé
- abstraktní synchronizováno
- abstraktní strictfp
Pojďme implementovat příklad abstraktní třídy a abstraktní metody.
//abstract class abstract class Bank{ abstract int getInterestRate(); } //concrete class class Citi extends Bank{ int getInterestRate(){return 7;} } //concrete class class HSBC extends Bank{ int getInterestRate(){return 6;} } class Main{ public static void main(String args()){ Bank b; b = new Citi (); // concrete class object System.out.println('Citi Rate of Interest is: '+b.getInterestRate()+'%'); b = new HSBC (); // concrete class object System.out.println('HSBC Rate of Interest is: '+b.getInterestRate()+'%'); } }
Výstup:
Ve výše uvedeném příkladu máme třídu Bank. V této třídě máme abstraktní metodu getInterestRate (). Pak deklarujeme dvě třídy - ICICI a BOI, které dědí z třídy Bank. Obě tyto třídy implementují metodu getInterestRate () vrácením příslušných úrokových sazeb.
Poté v hlavní metodě vytvoříme bankovní objekt. Nejprve bankovní objekt obsahuje objekt třídy ICICI a zobrazuje úrokovou sazbu. Dále je vytvořen objekt BOI a zobrazuje úrokovou sazbu.
Můžeme tedy předpokládat, že třída Bank je jakýmsi náčrtem nebo strukturou, která nám umožňuje získat úrokovou sazbu. Z této struktury můžeme vytvořit tolik konkrétních tříd, kolik chceme, a poté můžeme získat příslušné úrokové sazby pro každý bankovní objekt (to je ukázáno v hlavní metodě).
Jaké je použití abstraktní třídy v Javě
Proč používáme abstraktní třídu, když ve skutečnosti nemá žádnou vlastní implementaci?
Spolu s odpovědí na výše uvedenou otázku ukážeme také, jak použít abstraktní třídu v následujícím příkladu.
Uvažujme příklad vozidel. Víme, že vozidla mohou být mnoha typů. Můžeme mít auta, skútry, kola, mopedy, autobusy atd. Ačkoli existuje mnoho typů vozidel, mají některé vlastnosti nebo atributy, které jsou společné pro všechna vozidla bez ohledu na jejich typy.
Například, každé vozidlo má model, číslo podvozku, barvu atd. Každé z nich má funkce jako start, stop, akcelerace, brzda atd. Nyní bude mít každé vozidlo výše uvedené vlastnosti a metody, které jsou společné i pro ostatní. Zároveň jako uživatele vozidla by nás některé aspekty nemusí zajímat.
Například, pokud osoba řídí auto, bude ji zajímat pouze spuštění a zastavení vozidla nebo zrychlení nebo brzdění vozidla. Nebude mít zájem vědět, jak se vozidlo startuje nebo zastaví. Zajímá nás pouze abstraktní fungování funkcí, nikoli jejich podrobnosti.
Nyní, pokud chceme reprezentovat výše uvedený příklad systému do softwarové aplikace, jak jej tedy navrhneme? Nejprve implementujeme nějakou abstrakci. Nyní víme, že některé funkce jsou běžné, ale v závislosti na každém modelu se implementace těchto funkcí bude lišit.
Za prvé deklarujeme abstraktní třídu „Vozidlo“.
Tento systém jsme ukázali níže:
Takže budeme mít abstraktní třídu Vehicle a bude existovat konkrétní třída představující každý model vozidla. Pro ilustraci jsme použili pouze tři modely, tj. Auto, kolo a skútr.
Níže je uvedena hierarchie tříd z výše uvedeného systému.
abstract class Vehicle{ abstract void start () ; abstract void stop (); abstract void accelerate (); abstract void brake (); } class Car extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Bike extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Scooter extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} }
Takže budeme mít třídu abstraktních vozidel a tři třídy auto, kolo a skútr. Každá z těchto tříd rozšíří třídu Vehicle a přepíše každou z abstraktních metod.
Obecně tedy platí, že kdykoli musíme představovat takový systém, který má společné metody nebo operace, které máme reprezentovat, pak abychom uživateli představili pouze vnější perspektivu, přejdeme k abstrakci. Ve výsledku vyjmeme běžné metody a představíme je jako abstraktní metody a shromáždíme tyto abstraktní metody do společné abstraktní třídy.
Jakmile máme obrys systému reprezentovaného jako abstraktní třídu a operace jako abstraktní metody, můžeme z dané abstraktní třídy odvodit libovolný počet tříd a přepsat abstraktní metody pro implementaci těchto operací pro každou třídu.
Tímto způsobem je užitečné navrhnout systém.
Abstraktní třída a rozhraní
Viděli jsme abstraktní třídu výše. Rozhraní jsou ještě další stavební bloky, které implementují abstrakci. Rozhraní jsou smlouvy a třídy implementující rozhraní musí tyto smlouvy dodržovat.
Smlouvy v rozhraních nejsou nic jiného než metody, které nejsou implementovány. Uvnitř rozhraní budeme mít pouze prototypy metod. V rozhraní nebude existovat jediná implementace metod.
Pokud máme deklaraci rozhraní takto:
public interface interfaceA{ void myInterfaceMethod (); }
Pak každá třída, která implementuje interfaceA, musí přepsat ‚myInterfaceMethod '.
Pokud metodu ve třídě vůbec nepřepíšeme, pak je tato třída reprezentována jako abstraktní.
abstract class TestClass implements interfaceA{ // not a compulsion to override myInterfaceMethod. }
Později budeme mít samostatný návod na rozhraní.
Dále pojďme diskutovat o některých rozdílech mezi abstraktními třídami a rozhraními v Javě.
Rozdíl mezi abstraktní třídou a rozhraním
Abstraktní třída | Rozhraní |
---|---|
Abstraktní třída může mít soukromé nebo chráněné datové členy kromě veřejných členů. | Členové rozhraní jsou ve výchozím nastavení veřejní. |
Abstraktní třída může mít abstraktní a / nebo jiné než abstraktní metody. | Rozhraní může mít pouze abstraktní metody. |
Abstrakt může, ale nemusí obsahovat konečné proměnné. | Rozhraní mohou zakončovat proměnné jako výchozí proměnné. |
Abstraktní třída může mít konečné, statické nebo nestatické nebo nekoncové proměnné. | Rozhraní mohou mít pouze konečné a statické proměnné. |
Implementaci rozhraní může poskytnout abstraktní třída. | Rozhraní nemohou implementovat abstraktní třídu. |
Abstraktní třída se dědí pomocí klíčového slova „extends“. | Rozhraní je implementováno pomocí klíčového slova „implementuje“. |
Abstraktní třída může rozšířit další třídy nebo implementovat více rozhraní. | Rozhraní může implementovat pouze jiné rozhraní. |
Kdy použít abstraktní třídu a rozhraní v Javě
Rozhodnutí o tom, kdy použít abstraktní třídu a kdy použít rozhraní v aplikaci Java, by mělo být učiněno inteligentně po důkladném porozumění problému, který máte k dispozici. Existují dva aspekty, které musíme vzít v úvahu, jak je uvedeno níže.
Abstraktní třídy s částečným chováním
Víme, že abstraktní třídy nemusí být úplně implementovány méně. Mohou se chovat částečně. Na druhou stranu rozhraní nemají žádnou implementaci. Takže když si musíme vybrat mezi abstraktní třídou a implementací, musíme zvážit tento aspekt naší aplikace.
To znamená, že musíme nejprve rozhodnout, zda aplikace, kterou navrhujeme, má nějakou společnou částečnou implementaci, kterou můžeme oddělit v abstraktní třídě.
Například, zvažte, že navrhujeme webovou aplikaci. K tomu budeme muset použít některé webové technologie, jako je Servlet, REST API atd. Každá z těchto webových technologií má nyní některé techniky nebo kroky, které je třeba implementovat bez ohledu na aplikaci, kterou vyvíjíme. Poté vytvoříme naši přizpůsobenou aplikaci.
Takže v tomto případě lze definitivní kód, který musí webová technologie provést, vložit do abstraktní třídy. Můžeme pro to mít rozhraní? Ne. Je to proto, že rozhraní nemůže mít implementaci.
Rozhraní pouze na základě smlouvy
Víme, že rozhraní mají smlouvy nebo metody, které jsou jejich součástí. Tyto metody jsou pouze prototypy. Musíme implementovat tato rozhraní ve třídě a poté přepsat metody.
Nyní zvažte rozhraní Map v prostředí Java Collections Framework. Mnoho tříd jako HashMap, TreeMap a HashTable atd. Implementuje toto rozhraní. Každá z těchto tříd má jinou implementaci. Nemají žádné běžné chování, které lze reprezentovat v abstraktní třídě.
Takže uděláme, že navrhneme rozhraní s prototypy metod a poté implementujeme každou z tříd.
Tímto způsobem bychom měli každý faktor správně zvážit, než si vybereme mezi abstraktní třídou a rozhraním.
Rozdíl mezi abstrakcí a zapouzdřením
Pojďme diskutovat o některých rozdílech mezi abstrakcí a jedním dalším důležitým rysem OOP, tj. Zapouzdřením.
Abstrakce | Zapouzdření |
---|---|
Proces získávání a abstrahování informací | Proces vázání informací. |
Technika abstrakce je na úrovni designu nebo rozhraní. | Mechanismus zapouzdření je na úrovni implementace. |
Abstrakce skrývá detaily. | Zapouzdření váže informace v jedné jednotce, čímž je zajištěna bezpečnost informací. |
Abstrakce je implementována pomocí abstraktních tříd a rozhraní. | V zapouzdření hrají roli modifikátory přístupu, jmenovitě veřejné, soukromé a chráněné a výchozí. |
V abstrakci se uživateli zobrazí pouze abstraktní pohled, zatímco složitá a podrobná data se uživateli skryjí. | V zapouzdření jsou data seskupena jako jednotka a lze je chránit nebo zpřístupnit pomocí modifikátorů přístupu a metod getter a setter. |
Často kladené otázky
Otázka č. 1) Skrývají se abstrakce a data stejná?
Odpovědět: Ne, skrytí abstrakce a dat není totéž. Ale oba jsou důležité rysy objektově orientovaného programování. Zatímco abstrakce je proces skrývání detailů pozadí, skrývání dat je technika izolace dat od přímého přístupu.
Otázka 2) Jaké jsou výhody abstrakce?
Odpovědět: Několik výhod Abstrakce je uvedeno níže:
- Skrytím podrobností na pozadí a vystavením uživatele pouze abstraktního pohledu umožňuje abstrakce kód jednodušší a čitelnější.
- Jelikož abstrakce chrání nepotřebné detaily, zmenšuje kód.
- Údržba kódu může být složitá a obtížná bez abstrakce.
Otázka č. 3) Proč je abstrakce tak důležitá?
Odpovědět: Abstrakce nám umožňuje skrýt detaily pozadí, které jsou důležité a které mohou při úniku do světa vést k chaosu. Skrytím podrobností na pozadí a vystavením uživatele pouze požadovaného rozhraní abstrakce zjednodušuje aplikace.
Otázka č. 4) Vysvětlete abstrakci pomocí příkladu v reálném čase.
Odpovědět: Existuje mnoho příkladů abstrakce v reálném čase, včetně geometrických tvarů, vozidel atd. Dalším příkladem je ATM (Automated Teller Machine). Bankomat podporuje operace, jako je výběr hotovosti, kontrola zůstatku, převod peněz atd. Ale nevíme, jak tyto operace fungují interně.
Dostaneme pouze monitor s uživatelským rozhraním, abychom mohli vybrat a provést požadované operace.
Otázka č. 5) Můžeme dosáhnout abstrakce bez zapouzdření?
Odpovědět: Abstrakce chrání detaily implementace a zapouzdření skrývá podrobnosti objektu. Objekt je abstraktní formou reálného světa a jeho podrobnosti jsou skryty pomocí zapouzdření. Pro abstrakci je tedy nutné zapouzdření.
Závěr
V tomto kurzu jsme podrobně diskutovali o abstrakci v Javě. Abstrakce je technika skrývání nepotřebných detailů před uživatelem. Uživateli je poskytnut přístup pouze k relevantním podrobnostem. Provoz vozidel nebo provoz ATM jsou klasickými příklady abstrakcí v reálném světě.
Když používáme bankomat, zajímá nás pouze provádění operací, jako je výběr hotovosti atd., Aniž bychom museli znát podrobnosti o tom, jak přesně se tato operace provádí interně.
Java poskytuje abstrakci prostřednictvím abstraktních tříd a rozhraní. Zatímco rozhraní poskytují 100% abstrakci, abstraktní třídy poskytují částečnou abstrakci. Volba mezi rozhraními a abstraktními třídami by měla být provedena v závislosti na aplikaci, která má být vyvinuta, a také na tom, jaké informace mají být uživateli zobrazeny.
V tomto tutoriálu jsme také diskutovali o abstraktních metodách spolu s rozdíly mezi abstraktními třídami a rozhraními.
=> Zkontrolujte VŠECHNY výukové programy Java zde.
Doporučené čtení
- Výukový program pro rozhraní Java a abstraktní třídu s příklady
- Celé číslo Java a třída Java BigInteger s příklady
- Výukový program třídy skeneru Java s příklady
- Co je Java Vector | Výukový program Java Vector Class s příklady
- Java Enum: Výukový program Java Enumeration s příklady
- Základy jazyka Java: Java Syntax, třída Java a základní koncepty Java
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Java Iterator: Naučte se používat Iterátory v Javě s příklady