Абстрактен клас в Java е клас, който не може да бъде инстанциран директно. Целта на това е да действа като базов клас, от който другите класове могат да наследяват и разширяват. Една от важните характеристики е, че абстрактен клас има способността да дефинира конструкторите, които са известни като специални методи и които се извикват, когато се създава обект от клас.
Правила, които трябва да се следват при дефиниране на конструктори в абстрактен клас:
- Абстрактните класове могат да имат конструктори, но не могат да бъдат инстанцирани директно. Конструкторите се използват, когато се създава конкретен подклас.
- Може да има един или повече абстрактни методи в абстрактен клас, което означава, че тези методи не са имплементирани чрез класа. За да бъде създаден, подклас, който разширява абстрактен клас с абстрактни методи, трябва да имплементира методите. Това означава, че всеки абстрактен метод, деклариран в рамките на абстрактен клас, трябва да има имплементация, ако подкласът трябва да бъде конкретен клас и да може да бъде създаден. С други думи, функционалността, която абстрактният клас е оставил отворена, трябва да бъде попълнена от подкласа.
- Когато подклас разширява абстрактен клас с конструктори, подкласът трябва да извика един от конструкторите вътре в суперкласа с помощта на супер ключова дума. Тъй като конструкторът на суперклас инициализира състоянието на обекта и обединява всички жизненоважни ресурси. Ако сега подкласът не извика един от конструкторите в суперкласа, обектът няма да бъде добре инициализиран и сега няма да функционира ефективно/правилно.
- Възможно е да се дефинират повече от един конструктор в абстрактен клас, подобно на някой друг клас. Всеки конструктор обаче трябва да бъде дефиниран с различен списък с параметри. Той позволява на подкласовете да избират кой конструктор да извикат въз основа на техните специфични нужди.
Типове конструктори, реализирани с помощта на абстрактен клас:
Има три типа конструктори:
- Конструктор по подразбиране
- Параметризиран конструктор
- Конструктор за копиране
1. Конструктор по подразбиране: Конструкторът се създава автоматично чрез Java, ако в класа не е дефиниран друг конструктор. Той няма параметри и не извършва никакви движения освен инициализиране на стойностите по подразбиране за полетата на класа.
АЛГОРИТЪМ:
Етап 1: Дефинирайте абстрактен клас с име 'Shape'.
Стъпка 2: Декларирайте две целочислени променливи 'x' и 'y' като защитени.
Стъпка 3: Създайте конструктор по подразбиране на клас Shape и задайте „x“ и „y“ на 0.
Стъпка 4: Сега създайте метод 'getArea()', това е абстрактен метод, който ще върне двойна стойност
java сравнява низове
Стъпка 5: След това създайте два неабстрактни метода 'printPosition()' и 'setPosition(int x, int y)', който принадлежи към класа Shape.
Стъпка 6: Методът setPosition задава стойностите на x и y.
Стъпка 7: Методът printPosition отпечатва стойностите на x и y.
Стъпка 8: Дефинирайте клас Circle, който разширява класа Shape.
Стъпка 9: Декларирайте двойна променлива с име „радиус“ като защитена в класа Circle.
Стъпка 10: Дефинирайте конструктор за класа Circle, който приема двойна стойност за радиуса.
Стъпка 11: Приложете метода getArea за класа Circle, който изчислява площта на кръга.
Стъпка 12: Дефинирайте клас Square, който разширява класа Shape.
Стъпка 13: Декларирайте двойна променлива с име „страна“ като защитена в класа Square.
Стъпка 14: Дефинирайте конструктор за класа Square, който приема двойна стойност за страната.
Стъпка 15: Приложете метода getArea за класа Square, който изчислява площта на квадрата.
Стъпка 16: Дефинирайте основен клас.
сайтове като bedpage
Стъпка 17: Дефинирайте основната функция в класа Main.
Стъпка 18: Създайте кръгъл обект и квадратен обект.
Стъпка 19: Извикайте метода setPosition както за обектите Circle, така и Square.
Стъпка 20: Извикайте метода getArea за обектите Circle и Square и отпечатайте резултатите.
Стъпка 21: Извикайте метода printPosition за обектите Circle и Square и отпечатайте резултатите.
Изпълнение:
Ето изпълнението на горните стъпки
Име на файл: 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(); } }
Изход:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. Параметризиран конструктор: Когато създавате обект, този вид конструктор ви позволява да предавате аргументи към него. Когато искате да инициализирате обекта със стойности, това е полезно. Параметризираният конструктор се дефинира с един или допълнителни параметри и докато се създава обект, стойностите, предадени на конструктора, се използват за инициализиране на съответните полета на елемента.
АЛГОРИТЪМ:
Етап 1: Дефинирайте абстрактен клас Shape.
Стъпка 2: Добавете две защитени променливи на екземпляр от тип int с имена x и y.
Стъпка 3: Създайте параметризиран конструктор, който инициализира променливите на екземпляра x и y и приема два параметъра от тип int, x и y.
Стъпка 4: Дефинирайте абстрактен клас Shape.
Стъпка 5: Добавете две защитени променливи на екземпляр от тип int с имена x и y.
Стъпка 6: Създайте параметризиран конструктор, който инициализира променливите на екземпляра x и y и приема два параметъра от тип int, x и y.
Стъпка 7: Дефинирайте клас Circle, който разширява Shape.
Стъпка 8: Добавете защитена променлива на екземпляр от тип двойно наименуван радиус.
Стъпка 9: Дефинирайте параметризиран конструктор, който приема три параметъра от тип int x, y и двоен радиус и инициализира променливите на екземпляра x, y и radius с помощта на ключовата дума super().
Стъпка 10: Приложете абстрактния метод getArea() чрез изчисляване на площта на Circle.
Стъпка 11: Дефинирайте клас Square, който разширява Shape.
конкатенация на низове
Стъпка 12: Добавете защитена променлива на екземпляр от тип двойно име страна.
Стъпка 13: Дефинирайте параметризиран конструктор, който приема три параметъра от тип int x, y и двойна страна и инициализира променливите на екземпляра x, y и side с помощта на ключовата дума super().
Стъпка 14: Приложете абстрактния метод getArea() чрез изчисляване на площта на Square.
Стъпка 15: Дефинирайте клас Main.
Стъпка 16: Дефинирайте статичен метод с име main(), който е входната точка на програмата.
Стъпка 17: Създайте обект Circle с помощта на параметризиран конструктор.
Стъпка 18: Отпечатайте площта и позицията на обекта Circle, като използвате съответно методите getArea() и printPosition().
Стъпка 19: Създайте квадратен обект с помощта на параметризиран конструктор.
Стъпка 20: Отпечатайте площта и позицията на квадратния обект, като използвате съответно методите getArea() и printPosition().
Стъпка 21: Край на програмата.
Изпълнение:
Изпълнението на горните стъпки, споменати по-долу
Име на файл: ParameterizedMain.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(); } }
Изход:
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. Конструктор за копиране: конструкторът за копиране се използва за създаване на нов обект с равни стойности като съществуващ обект (т.е. елементът е създаден по-рано от). Полезно е, когато трябва да създадем нов обект, който може да е реплика на обект, който вече е наличен/съществувал. Конструкторът за копиране се дефинира само с един аргумент или един параметър, който е елемент от идентичен клас. След това конструкторът създава нов обект със същите стойности като обект на параметър.
АЛГОРИТЪМ:
инстанциране на java
Етап 1: Декларирайте абстрактен клас с променливи на екземпляр и конструктор по подразбиране.
Стъпка 2: Дефинирайте конструктор за копиране с параметър от идентичен тип клас.
Стъпка 3: В конструктора за копиране извикайте конструктора за копиране на суперклас, като използвате ключовата дума super, за да копирате променливите на екземпляра от обекта на параметъра в новия обект.
Стъпка 4: Присвоете стойностите на всички допълнителни променливи на екземпляра в рамките на подкласа към новия елемент.
Стъпка 5: Приложете абстрактния метод за изчисляване на площта.
Стъпка 6: Определете всички други методи, ако е необходимо.
Стъпка 7: В основната функция създайте обект от класа.
Стъпка 8: Задайте позицията и всички други променливи на екземпляра, ако е необходимо.
Стъпка 9: Създайте нов обект, като използвате конструктора за копиране и подадете оригиналния елемент като параметър.
Стъпка 10: Отпечатайте областта и позицията както на оригиналния, така и на копирания обект.
Изпълнение:
Изпълнението на горните стъпки е дадено по-долу
Име на файл: 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(); } }
Изход:
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)