Abstrakcia v Jave je proces, v ktorom používateľovi zobrazujeme iba podstatné detaily/funkcie. Nepodstatné podrobnosti implementácie sa používateľovi nezobrazujú.
V tomto článku sa dozvieme o abstrakcii a o tom, čo znamená abstrakt.
Jednoduchý príklad na pochopenie abstrakcie:
Diaľkové ovládanie televízora je vynikajúci príklad abstrakcie . Zjednodušuje interakciu s televízorom tým, že skrýva zložitosť za jednoduché tlačidlá a symboly, čo uľahčuje prácu bez toho, aby ste museli rozumieť technickým detailom fungovania televízora.
Čo je abstrakcia v jazyku Java?
V Jave sa abstrakcia dosahuje pomocou rozhrania a abstraktné triedy . Pomocou rozhraní môžeme dosiahnuť 100% abstrakciu.
Abstrakciu údajov možno definovať aj ako proces identifikácie iba požadovaných charakteristík objektu, pričom sa ignorujú nepodstatné detaily. Vlastnosti a správanie objektu ho odlišujú od iných objektov podobného typu a tiež pomáhajú pri klasifikácii/zoskupovaní objektov.
Príklad abstrakcie zo skutočného života:
Uvažujme o skutočnom príklade muža, ktorý riadi auto. Muž vie len to, že stlačenie plynu zvýši rýchlosť auta alebo brzdenie zastaví auto, ale nevie, ako sa po stlačení plynu rýchlosť v skutočnosti zvyšuje, nevie o vnútornom mechanizme auta alebo implementácia plynu, bŕzd a pod. v aute. Toto je abstrakcia.
Java abstraktné triedy a Java abstraktné metódy
- Abstraktná trieda je trieda, ktorá je deklarovaná pomocou abstraktného kľúčového slova.
- Abstraktná metóda je metóda, ktorá je deklarovaná bez implementácie.
- Abstraktná trieda môže alebo nemusí mať všetky abstraktné metódy. Niektoré z nich môžu byť konkrétne metódy
- Metódou definovaný abstrakt musí byť vždy predefinovaný v podtriede, čím sa vytvorí prvoradé povinná alebo samotná podtrieda je abstraktná.
- Každá trieda, ktorá obsahuje jednu alebo viac abstraktných metód, musí byť tiež deklarovaná s abstraktným kľúčovým slovom.
- Nemôže existovať žiadny objekt abstraktnej triedy. To znamená, že abstraktná trieda nemôže byť priamo inštancia s nového operátora .
- Abstraktná trieda môže mať parametrizované konštruktory a predvolený konštruktor je vždy prítomný v abstraktnej triede.
Algoritmus na implementáciu abstrakcie v jazyku Java
- Určite triedy alebo rozhrania, ktoré budú súčasťou abstrakcie.
- Vytvorte abstraktnú triedu alebo rozhranie, ktoré definuje spoločné správanie a vlastnosti týchto tried.
- Definujte abstraktné metódy v rámci abstraktnej triedy alebo rozhrania, ktoré nemajú žiadne podrobnosti o implementácii.
- Implementujte konkrétne triedy, ktoré rozširujú abstraktnú triedu alebo implementujú rozhranie.
- Prepíšte abstraktné metódy v konkrétnych triedach, aby ste poskytli ich špecifické implementácie.
- Na implementáciu logiky programu použite konkrétne triedy.
Kedy použiť abstraktné triedy a abstraktné metódy?
Sú situácie, v ktorých budeme chcieť definovať nadtriedu, ktorá deklaruje štruktúru danej abstrakcie bez poskytnutia kompletnej implementácie každej metódy. Niekedy budeme chcieť vytvoriť nadtriedu, ktorá definuje iba formu zovšeobecnenia, ktorú budú zdieľať všetky jej podtriedy, pričom vyplnenie podrobností necháme na každej podtriede.
Zoberme si príklad klasického tvaru, ktorý sa možno používa v systéme počítačom podporovaného dizajnu alebo pri simulácii hry. Základným typom je tvar a každý tvar má farbu, veľkosť atď. Z toho sú odvodené (zdedené) špecifické typy tvarov – kruh, štvorec, trojuholník atď. – každý z nich môže mať ďalšie vlastnosti a správanie. Niektoré tvary je možné napríklad prevrátiť. Niektoré správanie sa môže líšiť, napríklad keď chcete vypočítať plochu tvaru. Hierarchia typov stelesňuje podobnosti aj rozdiely medzi tvarmi.
Abstraktná trieda v Jave
Príklad Java abstrakcie
Príklad 1:
Java
začína javou
// Java program to illustrate the> // concept of Abstraction> abstract> class> Shape {> >String color;> > >// these are abstract methods> >abstract> double> area();> >public> abstract> String toString();> > >// abstract class can have the constructor> >public> Shape(String color)> >{> >System.out.println(>'Shape constructor called'>);> >this>.color = color;> >}> > >// this is a concrete method> >public> String getColor() {>return> color; }> }> class> Circle>extends> Shape {> >double> radius;> > >public> Circle(String color,>double> radius)> >{> > >// calling Shape constructor> >super>(color);> >System.out.println(>'Circle constructor called'>);> >this>.radius = radius;> >}> > >@Override> double> area()> >{> >return> Math.PI * Math.pow(radius,>2>);> >}> > >@Override> public> String toString()> >{> >return> 'Circle color is '> +>super>.getColor()> >+>'and area is : '> + area();> >}> }> class> Rectangle>extends> Shape {> > >double> length;> >double> width;> > >public> Rectangle(String color,>double> length,> >double> width)> >{> >// calling Shape constructor> >super>(color);> >System.out.println(>'Rectangle constructor called'>);> >this>.length = length;> >this>.width = width;> >}> > >@Override> double> area() {>return> length * width; }> > >@Override> public> String toString()> >{> >return> 'Rectangle color is '> +>super>.getColor()> >+>'and area is : '> + area();> >}> }> public> class> Test {> >public> static> void> main(String[] args)> >{> >Shape s1 =>new> Circle(>'Red'>,>2.2>);> >Shape s2 =>new> Rectangle(>'Yellow'>,>2>,>4>);> > >System.out.println(s1.toString());> >System.out.println(s2.toString());> >}> }> |
>
dva k jednému multiplexeru
>Výkon
Shape constructor called Circle constructor called Shape constructor called Rectangle constructor called Circle color is Redand area is : 15.205308443374602 Rectangle color is Yellowand area is : 8.0>
Príklad 2:
Java
// Java Program to implement> // Java Abstraction> > // Abstract Class declared> abstract> class> Animal {> >private> String name;> > >public> Animal(String name) {>this>.name = name; }> > >public> abstract> void> makeSound();> > >public> String getName() {>return> name; }> }> > // Abstracted class> class> Dog>extends> Animal {> >public> Dog(String name) {>super>(name); }> > >public> void> makeSound()> >{> >System.out.println(getName() +>' barks'>);> >}> }> > // Abstracted class> class> Cat>extends> Animal {> >public> Cat(String name) {>super>(name); }> > >public> void> makeSound()> >{> >System.out.println(getName() +>' meows'>);> >}> }> > // Driver Class> public> class> AbstractionExample {> >// Main Function> >public> static> void> main(String[] args)> >{> >Animal myDog =>new> Dog(>'Buddy'>);> >Animal myCat =>new> Cat(>'Fluffy'>);> > >myDog.makeSound();> >myCat.makeSound();> >}> }> |
>
>Výkon
Buddy barks Fluffy meows>
Vysvetlenie vyššie uvedeného programu Java:
java obsahuje podreťazec
Tento kód definuje abstraktnú triedu Animal s abstraktnou metódou makeSound(). Triedy Dog a Cat rozširujú Animal a implementujú metódu makeSound(). Metóda main() vytvára inštancie pes a mačka a volá na ne metódu makeSound().
Toto demonštruje koncept abstrakcie v Jave, kde definujeme šablónu pre triedu (v tomto prípade Animal), ale implementáciu určitých metód nechávame definovať podtriedami (v tomto prípade makeSound()).
Rozhranie
Rozhrania sú ďalšou metódou implementácie abstrakcie v Jave. Kľúčový rozdiel je v tom, že pomocou rozhraní môžeme dosiahnuť 100% abstrakciu v triedach Java. V jazyku Java alebo akomkoľvek inom jazyku rozhrania zahŕňajú metódy aj premenné, ale chýba im telo metódy. Okrem abstrakcie možno rozhrania použiť aj na implementáciu rozhraní v jazyku Java.
Implementácia: Na realizáciu an rozhranie používame kľúčové slovo náradia s triedou.
Java
// Define an interface named Shape> interface> Shape {> >double> calculateArea();>// Abstract method for> >// calculating the area> }> > // Implement the interface in a class named Circle> class> Circle>implements> Shape {> >private> double> radius;> > >// Constructor for Circle> >public> Circle(>double> radius) {>this>.radius = radius; }> > >// Implementing the abstract method from the Shape> >// interface> >public> double> calculateArea()> >{> >return> Math.PI * radius * radius;> >}> }> > // Implement the interface in a class named Rectangle> class> Rectangle>implements> Shape {> >private> double> length;> >private> double> width;> > >// Constructor for Rectangle> >public> Rectangle(>double> length,>double> width)> >{> >this>.length = length;> >this>.width = width;> >}> > >// Implementing the abstract method from the Shape> >// interface> >public> double> calculateArea() {>return> length * width; }> }> > // Main class to test the program> public> class> Main {> >public> static> void> main(String[] args)> >{> >// Creating instances of Circle and Rectangle> >Circle myCircle =>new> Circle(>5.0>);> >Rectangle myRectangle =>new> Rectangle(>4.0>,>6.0>);> > >// Calculating and printing the areas> >System.out.println(>'Area of Circle: '> >+ myCircle.calculateArea());> >System.out.println(>'Area of Rectangle: '> >+ myRectangle.calculateArea());> >}> }> |
javascript
>
>Výkon
Area of Circle: 78.53981633974483 Area of Rectangle: 24.0>
Výhody abstrakcie
Tu sú niektoré výhody abstrakcie:
- Znižuje zložitosť prezerania vecí.
- Zabraňuje duplicite kódu a zvyšuje znovupoužiteľnosť.
- Pomáha zvýšiť bezpečnosť aplikácie alebo programu, pretože používateľovi sa poskytujú iba základné podrobnosti.
- Zlepšuje udržiavateľnosť aplikácie.
- Zlepšuje modularitu aplikácie.
- Vylepšenie bude veľmi jednoduché, pretože bez ovplyvnenia koncových používateľov môžeme vykonávať akékoľvek zmeny v našom internom systéme.
- Zlepšuje opätovnú použiteľnosť a udržiavateľnosť kódu.
- Skryje podrobnosti implementácie a odkryje iba relevantné informácie.
- Poskytuje jasné a jednoduché rozhranie pre používateľa.
- Zvyšuje bezpečnosť zamedzením prístupu k interným detailom triedy.
- Podporuje modularitu, pretože zložité systémy možno rozdeliť na menšie a lepšie spravovateľné časti.
- Abstrakcia poskytuje spôsob, ako skryť zložitosť detailov implementácie pred používateľom, čo uľahčuje pochopenie a používanie.
- Abstrakcia umožňuje flexibilitu pri implementácii programu, pretože zmeny základných implementačných detailov možno vykonať bez ovplyvnenia používateľského rozhrania.
- Abstrakcia umožňuje modularitu a oddelenie záujmov, vďaka čomu je kód ľahšie udržiavateľný a ľahšie laditeľný.
Nevýhody abstrakcie v Jave
Tu sú hlavné nevýhody abstrakcie v Jave:
- Abstrakcia môže sťažiť pochopenie toho, ako systém funguje.
- Môže to viesť k zvýšenej zložitosti, najmä ak sa nepoužíva správne.
- To môže obmedziť flexibilitu implementácie.
- Abstrakcia môže pridať zbytočnú zložitosť kódu, ak sa nepoužíva správne, čo vedie k zvýšeniu času a úsilia pri vývoji.
- Abstrakcia môže sťažiť ladenie a pochopenie kódu, najmä pre tých, ktorí nepoznajú vrstvy abstrakcie a detaily implementácie.
- Nadmerné používanie abstrakcie môže mať za následok znížený výkon v dôsledku ďalších vrstiev kódu a nepriameho smerovania.
Prečítajte si tiež:
- Rozhrania v Jave
- Abstraktné triedy v Jave
- Rozdiel medzi abstraktnou triedou a rozhraním
- abstraktné kľúčové slovo v jazyku Java
Abstrakcia v Jave – často kladené otázky
Q1. Prečo používame abstrakt?
Jedným z kľúčových dôvodov, prečo používame abstraktné pojmy, je zjednodušenie zložitosti. Predstavte si, že sa snažíte vysvetliť celý vesmír každým jedným atómom a hviezdou! Abstrakty nám umožňujú oddialiť, zachytiť hlavné myšlienky ako gravitácia a energia a dať tomu všetkému zmysel bez toho, aby sme sa stratili v detailoch.
Tu je niekoľko ďalších dôvodov, prečo používame abstrakt v Jave:
1. Abstrakcia : Abstraktné triedy sa používajú na definovanie všeobecnej šablóny pre ostatné triedy. Definujú súbor pravidiel a pokynov, ktorými sa ich podtriedy musia riadiť. Poskytnutím abstraktnej triedy môžeme zabezpečiť, aby triedy, ktoré ju rozširujú, mali konzistentnú štruktúru a správanie. Vďaka tomu je kód organizovanejší a ľahšie sa udržiava.
2. Polymorfizmus : Abstraktné triedy a metódy umožňujú polymorfizmus v Jave. Polymorfizmus je schopnosť objektu nadobúdať rôzne podoby. To znamená, že premenná abstraktného typu môže obsahovať objekty akejkoľvek konkrétnej podtriedy tejto abstraktnej triedy. Vďaka tomu je kód flexibilnejší a prispôsobiteľný rôznym situáciám.
3. Rámce a rozhrania API: Java má množstvo rámcov a rozhraní API, ktoré používajú abstraktné triedy. Použitím abstraktných tried môžu vývojári ušetriť čas a námahu budovaním na existujúcom kóde a zameraním sa na aspekty špecifické pre ich aplikácie.
Q2. Aký je rozdiel medzi Zapuzdrenie a abstrakcia údajov?
Tu sú niektoré kľúčové rozdiely medzi čiernobielym zapuzdrením a abstráciou:
Zapuzdrenie
Abstrakcia
Zapuzdrenie je skrytie údajov (skrytie informácií) Abstrakcia je podrobné skrytie (skrytie implementácie). Zapuzdrenie zoskupuje údaje a metódy, ktoré na základe údajov pôsobia Data Abstraction sa zaoberá odhaľovaním rozhrania používateľovi a skrývaním detailov implementácie Zapuzdrené triedy sú triedy Java, ktoré sledujú skrytie a abstrakciu údajov Implementácia abstrakcie sa vykonáva pomocou abstraktných tried a rozhrania Zapuzdrenie je postup, ktorý prebieha na úrovni implementácie abstrakcia je proces na úrovni dizajnu
Q3. Aký je skutočný príklad abstrakcie údajov?
Diaľkové ovládanie televízora je vynikajúcim príkladom abstrakcie v reálnom živote. Zjednodušuje interakciu s televízorom tým, že skrýva zložitosť za jednoduché tlačidlá a symboly, čo uľahčuje prácu bez toho, aby ste museli rozumieť technickým detailom fungovania televízora.
Q4. Aký je rozdiel medzi abstraktnými triedami a rozhraniami v Jave?
Tu je niekoľko kľúčových rozdielov čiernobielych abstraktných tried a rozhraní v Jave:
Abstraktná trieda
binárne typy stromovRozhrania
Abstraktné triedy podporujú abstraktné a neabstraktné metódy Podpora rozhrania má iba abstraktné metódy. Nepodporuje viacnásobnú dedičnosť Podporuje viacnásobnú dedičnosť Abstraktné triedy možno rozšíriť o triedy Java a viaceré rozhrania Rozhranie je možné rozšíriť iba o rozhranie Java. Abstraktné členy triedy v jazyku Java môžu byť súkromné, chránené atď. Rozhrania sú štandardne verejné. Príklad:
verejná abstraktná trieda Vozidlo{
verejný abstrakt void drive()
}Príklad:
verejné rozhranie Zviera{
void speak();
}