Abstrakcja w Javie to proces, w którym pokazujemy użytkownikowi jedynie istotne szczegóły/funkcje. Nieistotne szczegóły implementacji nie są wyświetlane użytkownikowi.
W tym artykule dowiemy się, czym jest abstrakcja i co oznacza abstrakcja.
Prosty przykład zrozumienia abstrakcji:
Pilot do telewizora jest znakomity przykład abstrakcji . Upraszcza interakcję z telewizorem, ukrywając złożoność za prostymi przyciskami i symbolami, ułatwiając obsługę bez konieczności rozumienia szczegółów technicznych działania telewizora.
Co to jest abstrakcja w Javie?
W Javie abstrakcję osiąga się poprzez interfejsy I klasy abstrakcyjne . Za pomocą interfejsów możemy osiągnąć 100% abstrakcji.
Abstrakcję danych można również zdefiniować jako proces identyfikowania tylko wymaganych cech obiektu, ignorując nieistotne szczegóły. Właściwości i zachowania obiektu odróżniają go od innych obiektów podobnego typu, a także pomagają w klasyfikowaniu/grupowaniu obiektów.
Abstrakcja Przykład z życia wzięty:
Rozważmy przykład z życia wzięty, przedstawiający mężczyznę prowadzącego samochód. Człowiek wie tylko, że naciśnięcie pedału przyspieszenia zwiększy prędkość samochodu, a naciśnięcie hamulca zatrzyma samochód, ale nie wie, w jaki sposób po naciśnięciu pedału przyspieszenia prędkość faktycznie rośnie, nie wie o wewnętrznym mechanizmie samochodu lub wykonanie pedału gazu, hamulców itp. w samochodzie. To jest właśnie abstrakcja.
Klasy abstrakcyjne Java i metody abstrakcyjne Java
- Klasa abstrakcyjna to klasa zadeklarowana za pomocą abstrakcyjnego słowa kluczowego.
- Metoda abstrakcyjna to metoda zadeklarowana bez implementacji.
- Klasa abstrakcyjna może, ale nie musi, posiadać wszystkie metody abstrakcyjne. Niektóre z nich mogą być metodami konkretnymi
- Streszczenie zdefiniowane metodą musi być zawsze przedefiniowane w podklasie, co powoduje nadrzędny obowiązkowe lub czyniące samą podklasę abstrakcyjną.
- Każda klasa zawierająca jedną lub więcej metod abstrakcyjnych musi być również zadeklarowana za pomocą słowa kluczowego abstrakcyjnego.
- Nie może być obiektu klasy abstrakcyjnej. Oznacza to, że nie można bezpośrednio utworzyć instancji klasy abstrakcyjnej za pomocą metody nowego operatora .
- Klasa abstrakcyjna może mieć sparametryzowane konstruktory, a konstruktor domyślny jest zawsze obecny w klasie abstrakcyjnej.
Algorytm implementacji abstrakcji w Javie
- Określ klasy lub interfejsy, które będą częścią abstrakcji.
- Utwórz klasę abstrakcyjną lub interfejs, który definiuje typowe zachowania i właściwości tych klas.
- Zdefiniuj metody abstrakcyjne w klasie abstrakcyjnej lub interfejsie, które nie mają żadnych szczegółów implementacji.
- Zaimplementuj konkretne klasy, które rozszerzają klasę abstrakcyjną lub implementują interfejs.
- Zastąp metody abstrakcyjne w konkretnych klasach, aby zapewnić ich konkretne implementacje.
- Użyj konkretnych klas, aby zaimplementować logikę programu.
Kiedy używać klas abstrakcyjnych i metod abstrakcyjnych?
Zdarzają się sytuacje, w których będziemy chcieli zdefiniować nadklasę, która deklaruje strukturę danej abstrakcji, nie zapewniając jednocześnie pełnej implementacji każdej metody. Czasami będziemy chcieli utworzyć nadklasę, która definiuje jedynie formę uogólnienia, która będzie wspólna dla wszystkich jej podklas, pozostawiając każdej podklasie wypełnienie szczegółów.
Rozważmy przykład klasycznego kształtu, być może użytego w systemie projektowania wspomaganego komputerowo lub symulacji gier. Typ podstawowy to kształt, a każdy kształt ma kolor, rozmiar i tak dalej. Na tej podstawie wyprowadzane są (dziedziczone) określone typy kształtów – koło, kwadrat, trójkąt itd. – z których każdy może mieć dodatkowe cechy i zachowania. Na przykład niektóre kształty można odwrócić. Niektóre zachowania mogą być inne, na przykład gdy chcesz obliczyć pole kształtu. Hierarchia typów uosabia zarówno podobieństwa, jak i różnice między kształtami.
Klasa abstrakcyjna w Javie
Przykład abstrakcji Java
Przykład 1:
Jawa
rozmiar mojego monitora
// 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());> > }> }> |
>
Korzyści z Instagrama do użytku osobistego
>Wyjście
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>
Przykład 2:
Jawa
// 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();> > }> }> |
>
>Wyjście
Buddy barks Fluffy meows>
Wyjaśnienie powyższego programu Java:
Ten kod definiuje klasę abstrakcyjną Animal za pomocą abstrakcyjnej metody makeSound(). Klasy Dog i Cat stanowią rozszerzenie klasy Animal i implementują metodę makeSound(). Metoda main() tworzy instancje Dog i Cat i wywołuje na nich metodę makeSound().
konstruktor ciągów JavaTo demonstruje koncepcję abstrakcji w Javie, gdzie definiujemy szablon dla klasy (w tym przypadku Animal), ale implementację niektórych metod pozostawiamy do zdefiniowania przez podklasy (w tym przypadku makeSound()).
Interfejs
Interfejsy to kolejna metoda implementacji abstrakcji w Javie. Kluczowa różnica polega na tym, że używając interfejsów, możemy osiągnąć 100% abstrakcji w klasach Java. W Javie lub jakimkolwiek innym języku interfejsy zawierają zarówno metody, jak i zmienne, ale brakuje im treści metody. Oprócz abstrakcji interfejsy można również wykorzystać do implementacji interfejsów w Javie.
Realizacja: Aby wdrożyć interfejs używamy słowa kluczowego implementuje z klasą.
Jawa
// 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());> > }> }> |
>
hashset vs hashmap
>Wyjście
Area of Circle: 78.53981633974483 Area of Rectangle: 24.0>
Zalety abstrakcji
Oto kilka zalet abstrakcji:
- Zmniejsza to złożoność oglądania rzeczy.
- Zapobiega powielaniu kodu i zwiększa możliwość ponownego użycia.
- Pomaga zwiększyć bezpieczeństwo aplikacji lub programu, ponieważ użytkownikowi udostępniane są tylko niezbędne szczegóły.
- Poprawia łatwość konserwacji aplikacji.
- Poprawia modułowość aplikacji.
- Ulepszenie stanie się bardzo proste, ponieważ bez wpływu na użytkowników końcowych będziemy mogli dokonać dowolnego rodzaju zmian w naszym wewnętrznym systemie.
- Poprawia możliwość ponownego wykorzystania i konserwacji kodu.
- Ukrywa szczegóły implementacji i udostępnia tylko istotne informacje.
- Zapewnia przejrzysty i prosty interfejs dla użytkownika.
- Zwiększa bezpieczeństwo, uniemożliwiając dostęp do wewnętrznych szczegółów zajęć.
- Obsługuje modułowość, ponieważ złożone systemy można podzielić na mniejsze i łatwiejsze w zarządzaniu części.
- Abstrakcja umożliwia ukrycie przed użytkownikiem złożoności szczegółów implementacji, dzięki czemu jest łatwiejsza do zrozumienia i użycia.
- Abstrakcja pozwala na elastyczność we wdrażaniu programu, ponieważ zmiany w podstawowych szczegółach implementacji można wprowadzać bez wpływu na interfejs użytkownika.
- Abstrakcja umożliwia modułowość i separację problemów, dzięki czemu kod jest łatwiejszy w utrzymaniu i łatwiejszy do debugowania.
Wady abstrakcji w Javie
Oto główne wady abstrakcji w Javie:
- Abstrakcja może utrudnić zrozumienie działania systemu.
- Może to prowadzić do większej złożoności, zwłaszcza jeśli nie jest właściwie używane.
- Może to ograniczać elastyczność wdrożenia.
- Abstrakcja może zwiększyć niepotrzebną złożoność kodu, jeśli nie zostanie odpowiednio użyta, co prowadzi do wydłużenia czasu i wysiłku w zakresie programowania.
- Abstrakcja może utrudnić debugowanie i zrozumienie kodu, szczególnie osobom niezaznajomionym z warstwami abstrakcji i szczegółami implementacji.
- Nadużywanie abstrakcji może skutkować zmniejszeniem wydajności z powodu dodatkowych warstw kodu i pośredniości.
Przeczytaj także:
- Interfejsy w Javie
- Klasy abstrakcyjne w Javie
- Różnica między klasą abstrakcyjną a interfejsem
- abstrakcyjne słowo kluczowe w Javie
Abstrakcja w Javie – często zadawane pytania
Pytanie 1. Dlaczego używamy abstrakcji?
Jednym z kluczowych powodów, dla których używamy pojęć abstrakcyjnych, jest uproszczenie złożoności. Wyobraź sobie, że próbujesz wyjaśnić cały wszechświat za pomocą każdego pojedynczego atomu i gwiazdy! Abstrakcje pozwalają nam oddalić obraz, uchwycić główne idee, takie jak grawitacja i energia, i nadać temu wszystkiemu sens, nie gubiąc się w szczegółach.
Oto kilka innych powodów, dla których używamy abstrakcyjnego w Javie:
1. Abstrakcja : Klasy abstrakcyjne służą do definiowania ogólnego szablonu, z którego będą mogły korzystać inne klasy. Definiują zestaw zasad i wytycznych, których muszą przestrzegać ich podklasy. Udostępniając klasę abstrakcyjną, możemy zapewnić, że klasy ją rozszerzające będą miały spójną strukturę i zachowanie. Dzięki temu kod jest bardziej zorganizowany i łatwiejszy w utrzymaniu.
2. Polimorfizm : Klasy i metody abstrakcyjne umożliwiają polimorfizm w Javie. Polimorfizm to zdolność obiektu do przybierania wielu form. Oznacza to, że zmienna typu abstrakcyjnego może przechowywać obiekty dowolnej konkretnej podklasy tej klasy abstrakcyjnej. Dzięki temu kod jest bardziej elastyczny i można go dostosować do różnych sytuacji.
3. Frameworki i API: Java ma wiele frameworków i interfejsów API korzystających z klas abstrakcyjnych. Używając klas abstrakcyjnych, programiści mogą zaoszczędzić czas i wysiłek, opierając się na istniejącym kodzie i koncentrując się na aspektach specyficznych dla ich aplikacji.
Pytanie 2. Jaka jest różnica pomiędzy Hermetyzacja i abstrakcja danych?
Oto kilka kluczowych różnic między hermetyzacją a abstrakcją czarno-białą:
Kapsułkowanie
Abstrakcja
Hermetyzacja to ukrywanie danych (ukrywanie informacji) Abstrakcja to szczegółowe ukrywanie (ukrywanie implementacji). Hermetyzacja grupuje dane i metody działające na dane Abstrakcja danych polega na udostępnieniu użytkownikowi interfejsu i ukryciu szczegółów implementacji Klasy enkapsulowane to klasy Java, które stosują ukrywanie i abstrakcję danych Implementacja abstrakcji odbywa się za pomocą klas abstrakcyjnych i interfejsu Hermetyzacja to procedura, która odbywa się na poziomie wdrożenia abstrakcja jest procesem na poziomie projektu
Pytanie 3. Jaki jest rzeczywisty przykład abstrakcji danych?
Pilot do telewizora jest doskonałym, życiowym przykładem abstrakcji. Upraszcza interakcję z telewizorem, ukrywając złożoność za prostymi przyciskami i symbolami, ułatwiając obsługę bez konieczności rozumienia szczegółów technicznych działania telewizora.
Pytanie 4. Jaka jest różnica między klasami abstrakcyjnymi a interfejsami w Javie?
Oto kilka kluczowych różnic między klasami abstrakcyjnymi i interfejsami w Javie:
Klasa abstrakcyjna
Java analizuje ciąg znaków na intInterfejsy
Klasy abstrakcyjne obsługują metody abstrakcyjne i nieabstrakcyjne Obsługiwane interfejsy mają tylko metody abstrakcyjne. Nie obsługuje dziedziczenia wielokrotnego Obsługuje wielokrotne dziedziczenie Klasy abstrakcyjne można rozszerzać o klasy Java i wiele interfejsów Interfejs można rozszerzyć wyłącznie o interfejs Java. Członkowie klasy abstrakcyjnej w Javie mogą być prywatni, chronieni itp. Interfejsy są domyślnie publiczne. Przykład:
publiczna klasa abstrakcyjna Pojazd{
publiczny abstrakcyjny pusty dysk()
}Przykład:
interfejs publiczny Zwierzę{
nieważna rozmowa();
}