Klasa abstrakcyjna w Javie to klasa, której nie można bezpośrednio utworzyć. Celem tego jest działanie jako klasa bazowa, z której inne klasy mogą dziedziczyć i rozszerzać. Jedną z ważnych cech klasy abstrakcyjnej jest możliwość definiowania konstruktorów, zwanych metodami specjalnymi, które są wywoływane podczas tworzenia obiektu klasy.
Zasady, którymi należy się kierować przy definiowaniu konstruktorów w klasie abstrakcyjnej:
- Klasy abstrakcyjne mogą mieć konstruktory, ale nie można ich bezpośrednio tworzyć. Konstruktory są używane podczas tworzenia konkretnej podklasy.
- W klasie abstrakcyjnej może znajdować się jedna lub więcej metod abstrakcyjnych, co oznacza, że metody te nie są implementowane za pomocą tej klasy. Aby utworzyć instancję, podklasa rozszerzająca klasę abstrakcyjną o metody abstrakcyjne powinna implementować te metody. Oznacza to, że każda metoda abstrakcyjna zadeklarowana w klasie abstrakcyjnej musi mieć implementację, jeśli podklasa musi być konkretną klasą i istnieć możliwość jej utworzenia. Innymi słowy, funkcjonalność pozostawiona otwarta przez klasę abstrakcyjną musi zostać wypełniona przez podklasę.
- Kiedy podklasa rozszerza klasę abstrakcyjną o konstruktory, podklasa musi wywołać jeden z konstruktorów wewnątrz nadklasy za pomocą słowa kluczowego super. Ponieważ konstruktor nadklasy inicjuje stan obiektu i jednoczy wszelkie istotne zasoby. Jeśli podklasa nie wywoła teraz żadnego z konstruktorów w nadklasie, obiekt nie zostanie dobrze zainicjowany i nie będzie teraz działał wydajnie/poprawnie.
- Możliwe jest zdefiniowanie więcej niż jednego konstruktora w klasie abstrakcyjnej, podobnie jak w przypadku innych klas. Jednakże każdy konstruktor musi być zdefiniowany przy użyciu innej listy parametrów. Pozwala podklasom wybrać konstruktora, który ma wywołać, w zależności od ich konkretnych potrzeb.
Rodzaje konstruktorów implementowanych przy użyciu klasy abstrakcyjnej:
Istnieją trzy typy konstruktorów:
- Domyślny konstruktor
- Konstruktor parametryczny
- Kopiuj konstruktor
1. Konstruktor domyślny: Konstruktor jest tworzony automatycznie za pośrednictwem języka Java, jeśli w klasie nie zdefiniowano żadnego innego konstruktora. Nie posiada parametrów i nie wykonuje żadnych ruchów poza inicjowaniem wartości domyślnych dla pól klas.
ALGORYTM:
Krok 1: Zdefiniuj klasę abstrakcyjną o nazwie „Shape”.
Krok 2: Zadeklaruj dwie zmienne całkowite „x” i „y” jako chronione.
Krok 3: Utwórz domyślny konstruktor klasy Shape i ustaw „x” i „y” na 0.
Krok 4: Teraz utwórz metodę „getArea()”. Jest to metoda abstrakcyjna, która zwróci podwójną wartość
Krok 5: Następnie utwórz dwie nieabstrakcyjne metody „printPosition()” i „setPosition(int x, int y)”, które należą do klasy Shape.
Krok 6: Metoda setPosition ustawia wartości x i y.
Krok 7: Metoda printPosition drukuje wartości x i y.
Krok 8: Zdefiniuj klasę Circle, która rozszerza klasę Shape.
Krok 9: Zadeklaruj podwójną zmienną o nazwie „promień” jako chronioną w klasie Circle.
Krok 10: Zdefiniuj konstruktor dla klasy Circle, który akceptuje podwójną wartość promienia.
Wartość ciągu Java
Krok 11: Zaimplementuj metodę getArea dla klasy Circle, która oblicza pole koła.
Krok 12: Zdefiniuj klasę Square, która rozszerza klasę Shape.
Krok 13: Zadeklaruj podwójną zmienną o nazwie „side” jako chronioną w klasie Square.
Krok 14: Zdefiniuj konstruktor dla klasy Square, który akceptuje podwójną wartość boku.
Krok 15: Zaimplementuj metodę getArea dla klasy Square, która oblicza pole kwadratu.
Krok 16: Zdefiniuj klasę główną.
Krok 17: Zdefiniuj funkcję main w klasie Main.
Krok 18: Utwórz obiekt Okrąg i Kwadrat.
Krok 19: Wywołaj metodę setPosition zarówno dla obiektów Circle, jak i Square.
Krok 20: Wywołaj metodę getArea zarówno dla obiektów Circle, jak i Square i wydrukuj wyniki.
Krok 21: Wywołaj metodę printPosition dla obiektów Circle i Square i wydrukuj wyniki.
Realizacja:
Oto realizacja powyższych kroków
Nazwa pliku: DefaultMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // default constructor public Shape() { // initialize default values for fields x = 0; y = 0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The Position: ('+x + ', '+ y +')'); } } class Circle extends Shape { protected double radius; // constructor public Circle(double radius) { this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // constructor public Square(double side) { this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class DefaultMain { public static void main(String args []) { // create a Circle object Circle circle = new Circle(5); circle.setPosition(2,3); // print the area and position of the Circle object System.out.println('Area of a circle is: '+circle.getArea()); circle.printPosition(); // create a Square object Square square = new Square(4); square.setPosition(5, 7); // print the area and position of the Square object System.out.println('Area of a square is: '+square.getArea()); square.printPosition(); } }
Wyjście:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. Konstruktor sparametryzowany: Podczas tworzenia obiektu ten rodzaj konstruktora umożliwia przekazywanie do niego argumentów. Przydaje się to, gdy chcesz zainicjować obiekt wartościami. Sparametryzowany konstruktor jest zdefiniowany za pomocą jednego lub dodatkowych parametrów, a podczas tworzenia obiektu wartości przekazywane konstruktorowi służą do inicjalizacji odpowiednich pól elementu.
ALGORYTM:
Krok 1: Zdefiniuj klasę abstrakcyjną Shape.
dodaj ciąg Java
Krok 2: Dodaj dwie chronione zmienne instancji typu int o nazwach x i y.
Krok 3: Utwórz sparametryzowany konstruktor, który inicjuje zmienne instancji x i y oraz akceptuje dwa parametry typu int, x i y.
Krok 4: Zdefiniuj klasę abstrakcyjną Shape.
Krok 5: Dodaj dwie chronione zmienne instancji typu int o nazwach x i y.
Krok 6: Utwórz sparametryzowany konstruktor, który inicjuje zmienne instancji x i y oraz akceptuje dwa parametry typu int, x i y.
Krok 7: Zdefiniuj klasę Circle, która rozszerza Shape.
Krok 8: Dodaj chronioną zmienną instancji typu o podwójnej nazwie promień.
Krok 9: Zdefiniuj sparametryzowany konstruktor, który przyjmuje trzy parametry typu int x, y i double promień i inicjuje zmienne instancji x, y i promień za pomocą słowa kluczowego super().
Krok 10: Zaimplementuj abstrakcyjną metodę getArea(), obliczając pole koła.
Krok 11: Zdefiniuj klasę Square, która rozszerza Shape.
Krok 12: Dodaj chronioną zmienną instancji typu o podwójnej nazwie strona.
Krok 13: Zdefiniuj sparametryzowany konstruktor, który przyjmuje trzy parametry typu int x, y i double side i inicjuje zmienne instancji x, y i side za pomocą słowa kluczowego super().
Krok 14: Zaimplementuj abstrakcyjną metodę getArea(), obliczając pole kwadratu.
Krok 15: Zdefiniuj klasę Main.
Krok 16: Zdefiniuj metodę statyczną o nazwie main(), która będzie punktem wejścia programu.
Krok 17: Utwórz obiekt Circle za pomocą sparametryzowanego konstruktora.
Krok 18: Wydrukuj obszar i położenie obiektu Circle, używając odpowiednio metod getArea() i printPosition().
Krok 19: Utwórz obiekt Square za pomocą sparametryzowanego konstruktora.
Krok 20: Wydrukuj obszar i położenie obiektu Square, używając odpowiednio metod getArea() i printPosition().
Krok 21: Koniec programu.
Realizacja:
Realizacja powyższych kroków wymienionych poniżej
Nazwa pliku: SparametryzowanyMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // parameterized constructor public Shape(int x,int y) { this.x=x; this.y=y; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The position: ('+ x+', ' +y+')'); } } class Circle extends Shape { protected double radius; // parameterized constructor public Circle(int x,int y,double radius) { super(x,y); this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // parameterized constructor public Square(int x,int y,double side) { super(x, y); this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class ParameterizedMain { public static void main(String args []) { // create a Circle object with parameterized constructor Circle circle = new Circle(2, 3, 5); // print the area and position of the Circle object System.out.println('Area of circle is: '+circle.getArea()); circle.printPosition(); // create a Square object with parameterized constructor Square square = new Square(5, 7, 4); // print the area and position of the Square object System.out.println('Area of square is:' +square.getArea()); square.printPosition(); } }
Wyjście:
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. Kopiuj konstruktor: Konstruktor kopiujący służy do tworzenia nowego obiektu o takich samych wartościach jak istniejący obiekt (tj. element jest tworzony wcześniej). Przydaje się, gdy musimy stworzyć nowy obiekt, który może być repliką obiektu, który już istnieje. Konstruktor kopiujący jest zdefiniowany tylko z jednym argumentem lub jednym parametrem będącym elementem identycznej klasy. Następnie konstruktor tworzy nowy obiekt z tymi samymi wartościami, co obiekt parametrów.
ALGORYTM:
Krok 1: Zadeklaruj klasę abstrakcyjną ze zmiennymi instancji i konstruktorem domyślnym.
Krok 2: Zdefiniuj konstruktor kopiujący z parametrem o identycznym typie klasy.
sztuczna inteligencja i inteligentni agenci
Krok 3: W konstruktorze kopiującym wywołaj konstruktor kopiujący nadklasy, używając słowa kluczowego super, aby skopiować zmienne instancji z obiektu parametru do nowego obiektu.
Krok 4: Przypisz wartości dodatkowych zmiennych instancji w podklasie do nowego elementu.
Krok 5: Zaimplementuj metodę abstrakcyjną do obliczenia powierzchni.
Krok 6: W razie potrzeby zdefiniuj inne metody.
Krok 7: W funkcji main utwórz obiekt klasy.
Krok 8: Ustaw pozycję i inne zmienne instancji, jeśli to konieczne.
Krok 9: Utwórz nowy obiekt, korzystając z konstruktora kopiującego i przekazując oryginalny element jako parametr.
Krok 10: Wydrukuj obszar i położenie zarówno obiektów oryginalnych, jak i skopiowanych.
Realizacja:
Poniżej przedstawiono realizację powyższych kroków
Nazwa pliku: CopyMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // copy constructor public Shape(Shape other) { this.x=other.x; this.y=other.y; } // default constructor public Shape() { // initialize default values for fields x=0; y=0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x =x; this.y =y; } public void printPosition() { System.out.println('Position: (' +x+ ', ' +y+ ')'); } } class Circle extends Shape { protected double radius; // copy constructor public Circle(Circle other) { super(other); this.radius =other.radius; } // constructor public Circle(double radius) { this.radius =radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // copy constructor public Square(Square other) { super(other); this.side =other.side; } // constructor public Square(double side) { this.side=side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class CopyMain { public static void main(String[] args) { // create a Circle object Circle circle1 = new Circle(5); circle1.setPosition(2,3); // create a copy of the Circle object using the copy constructor Circle circle2 = new Circle(circle1); // print the area and position of the original and copied Circle objects System.out.println('Original Area of circle: ' +circle1.getArea()); circle1.printPosition(); System.out.println('Copied Area of circle: '+circle2.getArea()); circle2.printPosition(); // create a Square object Square square1 =new Square(4); square1.setPosition(5,7); // create a copy of the Square object using the copy constructor Square square2 = new Square(square1); // print the area and position of the original and copied Square objects System.out.println('Original Area of square: '+square1.getArea()); square1.printPosition(); System.out.println('Copied Area of square: '+square2.getArea()); square2.printPosition(); } }
Wyjście:
Original Area of circle: 78.53981633974483 Position: (2, 3) Copied Area of circle: 78.53981633974483 Position: (2, 3) Original Area of square: 16.0 Position: (5, 7) Copied Area of square: 16.0 Position: (5, 7)