Een abstracte klasse in Java is een klasse die niet rechtstreeks kan worden geïnstantieerd. Het doel hiervan is om te fungeren als een basisklasse waarvan de andere klassen kunnen overerven en uitbreiden. Een van de belangrijke kenmerken is dat een abstracte klasse de mogelijkheid heeft om constructors te definiëren, die bekend staan als speciale methoden en die worden aangeroepen wanneer een object van een klasse wordt gemaakt.
Regels die moeten worden gevolgd bij het definiëren van constructors in een abstracte klasse:
- Abstracte klassen kunnen constructors hebben, maar deze kunnen niet rechtstreeks worden geïnstantieerd. De constructors worden gebruikt wanneer een concrete subklasse wordt gemaakt.
- Er kunnen een of meer abstracte methoden in een abstracte klasse voorkomen, wat betekent dat deze methoden niet door middel van de klasse worden geïmplementeerd. Om te worden geïnstantieerd, moet een subklasse die een abstracte klasse uitbreidt met abstracte methoden de methoden implementeren. Het betekent dat elke abstracte methode die binnen een abstracte klasse wordt gedeclareerd, een implementatie moet hebben als een subklasse een concrete klasse moet zijn en geïnstantieerd moet kunnen worden. Met andere woorden: de functionaliteit die de abstracte klasse open heeft gelaten, moet door de subklasse worden ingevuld.
- Wanneer een subklasse een abstracte klasse uitbreidt met constructors, moet de subklasse een van de constructors binnen de superklasse aanroepen met behulp van een supersleutelwoord. Omdat de superklasse-constructor de status van het object initialiseert en alle vitale bronnen samenvoegt. Als de subklasse nu niet één van de constructors in de superklasse aanroept, zal het object niet goed geïnitialiseerd zijn en zal het nu niet efficiënt/correct functioneren.
- Het is mogelijk om meer dan één constructor in een abstracte klasse te definiëren, vergelijkbaar met een andere klasse. Elke constructor moet echter worden gedefinieerd met een andere parameterlijst. Het laat subklassen toe om te kiezen welke constructor ze moeten aanroepen op basis van hun specifieke behoeften.
Typen constructors geïmplementeerd met behulp van Abstract Class:
Er zijn drie soorten constructors:
- Standaardconstructeur
- Geparametriseerde constructor
- Kopieer constructeur
1. Standaardconstructeur: De constructor wordt automatisch via Java gemaakt als er geen andere constructor in de klasse is gedefinieerd. Het heeft geen parameters en voert geen enkele beweging uit, afgezien van het initialiseren van standaardwaarden voor klassenvelden.
ALGORITME:
Stap 1: Definieer een abstracte klasse met de naam 'Shape'.
Stap 2: Declareer twee integer-variabelen 'x' en 'y' als beschermd.
Stap 3: Maak een standaardconstructor van de Shape-klasse en stel 'x' en 'y' in op 0.
Stap 4: Maak nu een methode 'getArea()'. Het is een abstracte methode die een dubbele waarde gaat retourneren
Stap 5: Maak vervolgens twee niet-abstracte methoden 'printPosition()' en 'setPosition(int x, int y)' die tot de Shape-klasse behoren.
Stap 6: De setPosition-methode stelt de waarden van x en y in.
Stap 7: De printPosition-methode drukt de waarden van x en y af.
Stap 8: Definieer een Circle-klasse die de Shape-klasse uitbreidt.
Stap 9: Declareer een dubbele variabele met de naam 'radius' als beschermd in de klasse Circle.
Stap 10: Definieer een constructor voor de klasse Circle die een dubbele waarde voor de straal accepteert.
Stap 11: Implementeer de getArea-methode voor de klasse Circle, die de oppervlakte van de cirkel berekent.
Stap 12: Definieer een Square-klasse die de Shape-klasse uitbreidt.
Stap 13: Declareer een dubbele variabele met de naam 'side' als beschermd in de Square-klasse.
Stap 14: Definieer een constructor voor de klasse Square die een dubbele waarde voor de zijde accepteert.
Stap 15: Implementeer de getArea-methode voor de Square-klasse, die de oppervlakte van het vierkant berekent.
Stap 16: Definieer een hoofdklasse.
Stap 17: Definieer de hoofdfunctie in de klasse Main.
Stap 18: Maak een Circle-object en een Square-object.
'wat' is 10 van 100'
Stap 19: Roep de setPosition-methode aan voor zowel de Circle- als de Square-objecten.
Stap 20: Roep de getArea-methode aan voor zowel de Circle- als de Square-objecten en druk de resultaten af.
Stap 21: Roep de methode printPosition aan voor zowel de Circle- als de Square-objecten en druk de resultaten af.
Implementatie:
Hier is de implementatie van bovenstaande stappen
Bestandsnaam: StandaardMain.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(); } }
Uitgang:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. Geparametriseerde constructor: Wanneer u een object maakt, kunt u met dit soort constructor er argumenten aan doorgeven. Wanneer u het object met waarden wilt initialiseren, is dit handig. De geparametriseerde constructor wordt gedefinieerd met één of extra parameters, en terwijl een object wordt gemaakt, worden de waarden die aan de constructor worden doorgegeven gebruikt om de overeenkomstige velden van het item te initialiseren.
ALGORITME:
Stap 1: Definieer een abstracte klasse Shape.
Stap 2: Voeg twee beschermde instantievariabelen van het type int toe, genaamd x en y.
Stap 3: Maak een geparametriseerde constructor die de instantievariabelen x en y initialiseert en twee parameters van het type int, x en y accepteert.
Stap 4: Definieer een abstracte klasse Shape.
Stap 5: Voeg twee beschermde instantievariabelen van het type int toe, genaamd x en y.
Stap 6: Maak een geparametriseerde constructor die de instantievariabelen x en y initialiseert en twee parameters van het type int, x en y accepteert.
Stap 7: Definieer een klasse Cirkel die Shape uitbreidt.
Stap 8: Voeg een beschermde instantievariabele van het type dubbel genoemde radius toe.
Stap 9: Definieer een geparametriseerde constructor die drie parameters van het type int x, y en double radius gebruikt en de instantievariabelen x, y en radius initialiseert met behulp van het sleutelwoord super().
Stap 10: Implementeer de abstracte methode getArea() door de oppervlakte van Circle te berekenen.
Stap 11: Definieer een klasse Vierkant die Shape uitbreidt.
Stap 12: Voeg een beschermde instantievariabele van het type dubbel genoemde kant toe.
Stap 13: Definieer een geparametriseerde constructor die drie parameters van het type int x, y en double side gebruikt en de x-, y- en side-instantievariabelen initialiseert met behulp van het sleutelwoord super().
Stap 14: Implementeer de abstracte methode getArea() door de oppervlakte van Square te berekenen.
Stap 15: Definieer een klasse Hoofd.
Stap 16: Definieer een statische methode met de naam main() die het startpunt van het programma is.
Stap 17: Maak een Circle-object met behulp van een geparametriseerde constructor.
Stap 18: Druk het gebied en de positie van het Circle-object af met respectievelijk de methoden getArea() en printPosition().
Stap 19: Maak een Square-object met behulp van een geparametriseerde constructor.
Stap 20: Druk het gebied en de positie van het Square-object af met respectievelijk de methoden getArea() en printPosition().
Stap 21: Einde van het programma.
Implementatie:
De implementatie van de bovenstaande stappen staat hieronder vermeld
Bestandsnaam: GeparametriseerdeMain.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(); } }
Uitgang:
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. Kopieer de constructor: copy constructor wordt gebruikt om een nieuw object te maken met dezelfde waarden als een bestaand object (dat wil zeggen: het item is eerder gemaakt dan). Het is handig als we een nieuw object moeten maken dat een replica kan zijn van een object dat al aanwezig/bestaat. De kopieerconstructor wordt gedefinieerd met slechts één argument of één parameter die een item van identieke klasse is. Vervolgens maakt de constructor een nieuw object met dezelfde waarden als een parameterobject.
ALGORITME:
Stap 1: Declareer een abstracte klasse met instantievariabelen en standaardconstructor.
Stap 2: Definieer een kopieconstructor met een parameter van hetzelfde klassetype.
Stap 3: Roep in de kopieerconstructor de superklasse-kopieconstructor aan met het sleutelwoord super om de instantievariabelen van het parameterobject naar het nieuwe object te kopiëren.
Stap 4: Wijs de waarden van eventuele extra instantievariabelen binnen de subklasse toe aan het nieuwe item.
Stap 5: Implementeer de abstracte methode om het gebied te berekenen.
Stap 6: Definieer indien nodig andere methoden.
Stap 7: Maak in de hoofdfunctie een object van de klasse.
Stap 8: Stel indien nodig de positie en eventuele andere instantievariabelen in.
Stap 9: Maak een nieuw object door gebruik te maken van de kopieerconstructor en het originele item als parameter door te geven.
Stap 10: Druk het gebied en de positie van zowel het originele als het gekopieerde object af.
Implementatie:
Hieronder wordt de implementatie van bovenstaande stappen weergegeven
Bestandsnaam: KopieerMain.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(); } }
Uitgang:
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)