logo

Abstrakce v Javě

Abstrakce v Javě je proces, ve kterém uživateli ukazujeme pouze podstatné detaily/funkci. Nepodstatné podrobnosti implementace se uživateli nezobrazují.

V tomto článku se dozvíme o abstrakci a o tom, co znamená abstrakt.



Jednoduchý příklad pro pochopení abstrakce:

Televizní dálkové ovládání je vynikající příklad abstrakce . Zjednodušuje interakci s televizorem tím, že skrývá složitost za jednoduchá tlačítka a symboly, takže je snadné, aniž byste museli rozumět technickým detailům fungování televizoru.

Co je abstrakce v Javě?

V Javě se abstrakce dosahuje pomocí rozhraní a abstraktní třídy . Pomocí rozhraní můžeme dosáhnout 100% abstrakce.

Abstrakce dat může být také definována jako proces identifikace pouze požadovaných charakteristik objektu ignorující nepodstatné detaily. Vlastnosti a chování objektu jej odlišují od jiných objektů podobného typu a také pomáhají při klasifikaci/seskupování objektů.



Příklad abstrakce ze skutečného života:

Vezměme si příklad ze skutečného života muže, který řídí auto. Muž pouze ví, že sešlápnutím plynu se zvýší rychlost auta nebo sešlápnutím brzdy se auto zastaví, ale neví, jak se při sešlápnutí plynu rychlost ve skutečnosti zvyšuje, neví o vnitřním mechanismu auta nebo implementaci plynu, brzd atd. v autě. Toto je abstrakce.

Java abstraktní třídy a Java abstraktní metody

  1. Abstraktní třída je třída, která je deklarována pomocí abstraktního klíčového slova.
  2. Abstraktní metoda je metoda, která je deklarována bez implementace.
  3. Abstraktní třída může nebo nemusí mít všechny abstraktní metody. Některé z nich mohou být konkrétní metody
  4. Abstrakt definovaný metodou musí být v podtřídě vždy předefinován, čímž vzniká prvořadé povinná nebo samotná podtřída je abstraktní.
  5. Každá třída, která obsahuje jednu nebo více abstraktních metod, musí být také deklarována pomocí abstraktního klíčového slova.
  6. Nemůže existovat žádný objekt abstraktní třídy. To znamená, že abstraktní třídu nelze přímo vytvořit instanci s nového operátora .
  7. Abstraktní třída může mít parametrizované konstruktory a výchozí konstruktor je vždy přítomen v abstraktní třídě.

Algoritmus pro implementaci abstrakce v Javě

  1. Určete třídy nebo rozhraní, která budou součástí abstrakce.
  2. Vytvořte abstraktní třídu nebo rozhraní, které definuje společné chování a vlastnosti těchto tříd.
  3. Definujte abstraktní metody v rámci abstraktní třídy nebo rozhraní, které nemají žádné podrobnosti o implementaci.
  4. Implementujte konkrétní třídy, které rozšiřují abstraktní třídu nebo implementují rozhraní.
  5. Přepište abstraktní metody v konkrétních třídách a poskytněte jejich konkrétní implementace.
  6. Použijte konkrétní třídy k implementaci programové logiky.

Kdy použít abstraktní třídy a abstraktní metody?

Existují situace, ve kterých budeme chtít definovat nadtřídu, která deklaruje strukturu dané abstrakce, aniž by poskytovala kompletní implementaci každé metody. Někdy budeme chtít vytvořit nadtřídu, která pouze definuje formu zobecnění, která bude sdílena všemi jejími podtřídami, přičemž vyplnění podrobností ponecháme na každé podtřídě.

Vezměme si příklad klasického tvaru, který se možná používá v počítačově podporovaném konstrukčním systému nebo herní simulaci. Základním typem je tvar a každý tvar má barvu, velikost a tak dále. Z toho jsou odvozeny (zděděné) specifické typy tvarů – kruh, čtverec, trojúhelník atd. – každý z nich může mít další vlastnosti a chování. Některé tvary lze například převrátit. Některá chování se mohou lišit, například když chcete vypočítat plochu tvaru. Hierarchie typů ztělesňuje jak podobnosti, tak rozdíly mezi tvary.



Abstraktní třída v Javě

Příklad Java abstrakce

Příklad 1:

Jáva


začíná 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());> >}> }>

>

terminál kali linux
>

Výstup

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>

Příklad 2:

Jáva




// 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ýstup

Buddy barks Fluffy meows>

Vysvětlení výše uvedeného programu Java:

Tento kód definuje abstraktní třídu Animal s abstraktní metodou makeSound(). Třídy Pes a Kočka rozšiřují Animal a implementují metodu makeSound(). Metoda main() vytváří instance Pes a Kočka a volá na ně metodu makeSound().

To demonstruje koncept abstrakce v Javě, kde definujeme šablonu pro třídu (v tomto případě Animal), ale implementaci určitých metod necháváme definovat podtřídami (v tomto případě makeSound()).

Rozhraní

Rozhraní jsou další metodou implementace abstrakce v Javě. Klíčový rozdíl je v tom, že pomocí rozhraní můžeme dosáhnout 100% abstrakce ve třídách Java. V Javě nebo jakémkoli jiném jazyce rozhraní zahrnují metody i proměnné, ale postrádají tělo metody. Kromě abstrakce lze rozhraní použít také k implementaci rozhraní v Javě.

Implementace: Pro realizaci an rozhraní používáme klíčové slovo nářadí s tř.

Jáva


sčítačka plná sčítačka



java programy
// 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());> >}> }>

>

>

Výstup

Area of Circle: 78.53981633974483 Area of Rectangle: 24.0>

Výhody abstrakce

Zde jsou některé výhody abstrakce:

  1. Snižuje to složitost prohlížení věcí.
  2. Zabraňuje duplikaci kódu a zvyšuje opětovnou použitelnost.
  3. Pomáhá zvýšit zabezpečení aplikace nebo programu, protože uživateli jsou poskytovány pouze základní podrobnosti.
  4. Zlepšuje udržovatelnost aplikace.
  5. Zlepšuje modularitu aplikace.
  6. Vylepšení bude velmi snadné, protože bez dopadu na koncové uživatele můžeme provádět jakýkoli typ změn v našem interním systému.
  7. Zlepšuje znovupoužitelnost a udržovatelnost kódu.
  8. Skryje podrobnosti implementace a zpřístupní pouze relevantní informace.
  9. Poskytuje jasné a jednoduché rozhraní pro uživatele.
  10. Zvyšuje bezpečnost tím, že zabraňuje přístupu k podrobnostem interní třídy.
  11. Podporuje modularitu, protože složité systémy lze rozdělit na menší a lépe ovladatelné části.
  12. Abstrakce poskytuje způsob, jak před uživatelem skrýt složitost detailů implementace, což usnadňuje pochopení a používání.
  13. Abstrakce umožňuje flexibilitu při implementaci programu, protože změny základních implementačních detailů mohou být provedeny bez ovlivnění uživatelského rozhraní.
  14. Abstrakce umožňuje modularitu a oddělení zájmů, díky čemuž je kód lépe udržovatelný a snadněji laditelný.

Nevýhody abstrakce v Javě

Zde jsou hlavní nevýhody abstrakce v Javě:

  1. Abstrakce může ztížit pochopení toho, jak systém funguje.
  2. To může vést ke zvýšené složitosti, zejména pokud není používáno správně.
  3. To může omezit flexibilitu implementace.
  4. Abstrakce může přidat zbytečnou složitost kódu, pokud se nepoužívá správně, což vede ke zvýšení času a úsilí na vývoj.
  5. Abstrakce může ztížit ladění a pochopení kódu, zejména pro ty, kteří neznají vrstvy abstrakce a detaily implementace.
  6. Nadměrné používání abstrakce může mít za následek snížený výkon v důsledku dalších vrstev kódu a nepřímosti.

Přečtěte si také:

Abstrakce v Javě – FAQ

Q1. Proč používáme abstraktní?

Jedním z klíčových důvodů, proč používáme abstraktní pojmy, je zjednodušení složitosti. Představte si, že se snažíte vysvětlit celý vesmír pomocí každého jednotlivého atomu a hvězdy! Abstrakty nám umožňují oddálit, uchopit hlavní myšlenky, jako je gravitace a energie, a dát tomu všemu smysl, aniž bychom se ztráceli v detailech.

Zde je několik dalších důvodů, proč používáme abstrakt v Javě:

1. Abstrakce : Abstraktní třídy se používají k definování obecné šablony pro ostatní třídy, které mají následovat. Definují soubor pravidel a pokynů, kterými se musí jejich podtřídy řídit. Poskytnutím abstraktní třídy můžeme zajistit, aby třídy, které ji rozšiřují, měly konzistentní strukturu a chování. Díky tomu je kód přehlednější a snáze se udržuje.

2. Polymorfismus : Abstraktní třídy a metody umožňují polymorfismus v Javě. Polymorfismus je schopnost předmětu nabývat mnoha podob. To znamená, že proměnná abstraktního typu může obsahovat objekty jakékoli konkrétní podtřídy této abstraktní třídy. Díky tomu je kód flexibilnější a přizpůsobitelný různým situacím.

3. Rámce a rozhraní API: Java má mnoho rámců a API, které používají abstraktní třídy. Pomocí abstraktních tříd mohou vývojáři ušetřit čas a námahu tím, že budou stavět na existujícím kódu a zaměří se na aspekty specifické pro jejich aplikace.

Q2. Jaký je rozdíl mezi Zapouzdření a abstrakce dat?

Zde jsou některé klíčové rozdíly v černobílém zapouzdření a abstraci:

Zapouzdření

Abstrakce

Zapouzdření je skrytí dat (skrytí informací) Abstrakce je podrobné skrytí (skrytí implementace).
Zapouzdření seskupuje data a metody, které na data působí Data Abstraction se zabývají odhalením rozhraní uživateli a skrytím detailů implementace
Zapouzdřené třídy jsou třídy Java, které následují skrývání a abstrakci dat Implementace abstrakce se provádí pomocí abstraktních tříd a rozhraní
Zapouzdření je postup, který probíhá na úrovni implementace abstrakce je proces na úrovni návrhu

Q3. Jaký je skutečný příklad abstrakce dat?

Televizní dálkové ovládání je vynikajícím příkladem abstrakce v reálném životě. Zjednodušuje interakci s televizorem tím, že skrývá složitost za jednoduchá tlačítka a symboly, takže je snadné, aniž byste museli rozumět technickým detailům fungování televizoru.

Q4. Jaký je rozdíl mezi abstraktními třídami a rozhraními v Javě?

Zde jsou některé klíčové rozdíly černobílých abstraktních tříd a rozhraní v Javě:

Abstraktní třída

jak číst ze souboru csv v java

Rozhraní

Abstraktní třídy podporují abstraktní a neabstraktní metody Podpora rozhraní má pouze abstraktní metody.
Nepodporuje vícenásobnou dědičnost Podporuje vícenásobnou dědičnost
Abstraktní třídy lze rozšířit o třídy Java a více rozhraní Rozhraní lze rozšířit pouze o rozhraní Java.
Abstraktní členové třídy v Javě mohou být soukromé, chráněné atd. Rozhraní jsou ve výchozím nastavení veřejná.

Příklad:

veřejná abstraktní třída Vechicle{
public abstract void drive()
}

Příklad:

veřejné rozhraní Zvíře{
void speak();
}