Abstrakčioji klasė Java yra klasė, kurios negalima tiesiogiai sukurti. To tikslas yra veikti kaip bazinė klasė, iš kurios kitos klasės gali būti paveldėtos ir išplėstos. Viena iš svarbių savybių, kad abstrakčioji klasė turi galimybę apibrėžti konstruktorius, kurie yra žinomi kaip specialieji metodai ir kurie iškviečiami, kai sukuriamas klasės objektas.
Taisyklės, kurių reikia laikytis apibrėžiant konstruktorius abstrakčioje klasėje:
- Abstrakčios klasės gali turėti konstruktorius, tačiau jų negalima tiesiogiai sukurti. Konstruktoriai naudojami, kai sukuriamas konkretus poklasis.
- Abstrakčioje klasėje gali būti vienas ar daugiau abstrakčių metodų, o tai reiškia, kad tie metodai nėra įgyvendinami naudojant klasę. Kad būtų galima sukurti egzempliorių, poklasis, kuris išplečia abstrakčią klasę abstrakčiais metodais, turėtų įgyvendinti metodus. Tai reiškia, kad kiekvienas abstraktus metodas, deklaruotas abstrakčioje klasėje, turi turėti įgyvendinimą, jei poklasis turi būti konkreti klasė ir gali būti pakartotas. Kitaip tariant, funkcionalumą, kurį abstrakčioji klasė paliko atvirą, turi užpildyti poklasis.
- Kai poklasis išplečia abstrakčią klasę konstruktoriais, poklasis turi iškviesti vieną iš konstruktorių, esančių superklasėje, naudodamas super raktinį žodį. Nes superklasės konstruktorius inicijuoja objekto būseną ir sujungia visus gyvybiškai svarbius išteklius. Jei poklasis dabar neiškviečia vieno iš superklasės konstruktorių, objektas nebus tinkamai inicijuotas ir dabar neveiks efektyviai/teisingai.
- Abstrakčioje klasėje galima apibrėžti daugiau nei vieną konstruktorių, panašią į kai kurias kitas klases. Tačiau kiekvienas konstruktorius turi būti apibrėžtas su skirtingu parametrų sąrašu. Tai leidžia poklasiams pasirinkti, kurį konstruktorių skambinti atsižvelgiant į konkrečius jų poreikius.
Konstruktorių tipai, įdiegti naudojant abstrakčią klasę:
Yra trijų tipų konstruktoriai:
- Numatytasis konstruktorius
- Parametrizuotas konstruktorius
- Kopijavimo konstruktorius
1. Numatytasis konstruktorius: Konstruktorius automatiškai sukuriamas naudojant Java, jei klasėje neapibrėžtas joks kitas konstruktorius. Jis neturi parametrų ir neatlieka jokių veiksmų, išskyrus numatytųjų klasės laukų verčių inicijavimą.
ALGORITMAS:
1 žingsnis: Apibrėžkite abstrakčią klasę pavadinimu „Forma“.
2 žingsnis: Paskelbkite du sveikuosius kintamuosius „x“ ir „y“ kaip apsaugotus.
3 veiksmas: Sukurkite numatytąjį „Shape“ klasės konstruktorių ir „x“ bei „y“ nustatykite į 0.
4 veiksmas: Dabar sukurkite metodą „getArea()“, tai yra abstraktus metodas, kuris grąžins dvigubą reikšmę
5 veiksmas: Tada sukurkite du neabstrakčius metodus „printPosition()“ ir „setPosition(int x, int y)“, kurie priklauso Shape klasei.
6 veiksmas: Metodas setPosition nustato x ir y reikšmes.
7 veiksmas: PrintPosition metodas spausdina x ir y reikšmes.
8 veiksmas: Apibrėžkite apskritimo klasę, kuri išplečia formos klasę.
9 veiksmas: Paskelbkite dvigubą kintamąjį pavadinimu 'spindulys' kaip apsaugotą apskritimo klasėje.
10 veiksmas: Apibrėžkite apskritimo klasės konstruktorių, kuris priima dvigubą spindulio reikšmę.
11 veiksmas: Apskritimo klasei, kuri apskaičiuoja apskritimo plotą, įdiekite metodą getArea.
12 veiksmas: Apibrėžkite kvadratinę klasę, kuri išplečia formos klasę.
13 veiksmas: Paskelbkite dvigubą kintamąjį pavadinimu „side“ kaip apsaugotą kvadrato klasėje.
14 veiksmas: Apibrėžkite kvadrato klasės konstruktorių, kuris priima dvigubą pusės reikšmę.
15 veiksmas: Įdiekite kvadrato klasei metodą getArea, kuris apskaičiuoja kvadrato plotą.
16 veiksmas: Apibrėžkite pagrindinę klasę.
17 veiksmas: Apibrėžkite pagrindinę funkciją pagrindinėje klasėje.
18 veiksmas: Sukurkite apskritimo objektą ir kvadratinį objektą.
19 veiksmas: Iškvieskite setPosition metodą apskritimo ir kvadrato objektams.
20 veiksmas: Iškvieskite getArea metodą apskritimo ir kvadrato objektams ir išspausdinkite rezultatus.
21 veiksmas: Iškvieskite „printPosition“ metodą apskritimo ir kvadrato objektams ir išspausdinkite rezultatus.
Įgyvendinimas:
Čia yra aukščiau aprašytų veiksmų įgyvendinimas
Failo pavadinimas: 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(); } }
Išvestis:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. Parametrizuotas konstruktorius: Kuriant objektą tokio tipo konstruktorius leidžia jam perduoti argumentus. Jei norite inicijuoti objektą su reikšmėmis, tai naudinga. Konstruktorius su parametrais apibrėžiamas vienu ar papildomais parametrais, o kol objektas sukuriamas, konstruktoriui perduodamos reikšmės naudojamos atitinkamiems elemento laukams inicijuoti.
ALGORITMAS:
1 žingsnis: Apibrėžkite abstrakčią klasę Shape.
2 žingsnis: Pridėkite du apsaugotus egzempliorių kintamuosius, kurių tipas yra int, pavadinimu x ir y.
3 veiksmas: Sukurkite parametrizuotą konstruktorių, kuris inicijuoja egzempliorių kintamuosius x ir y ir priima du int tipo parametrus, x ir y.
4 veiksmas: Apibrėžkite abstrakčią klasę Shape.
5 veiksmas: Pridėkite du apsaugotus egzempliorių kintamuosius, kurių tipas yra int, pavadinimu x ir y.
6 veiksmas: Sukurkite parametrizuotą konstruktorių, kuris inicijuoja egzempliorių kintamuosius x ir y ir priima du int tipo parametrus, x ir y.
7 veiksmas: Apibrėžkite klasės apskritimą, kuris pratęsia formą.
8 veiksmas: Pridėkite apsaugotą egzemplioriaus kintamąjį, kurio tipas yra dvigubas pavadinimas spindulys.
9 veiksmas: Apibrėžkite parametrizuotą konstruktorių, kuris paima tris int x, y ir dvigubo spindulio tipo parametrus ir inicijuoja x, y ir spindulio egzempliorių kintamuosius naudojant super() raktinį žodį.
10 veiksmas: Įdiekite abstraktų metodą getArea() apskaičiuodami apskritimo plotą.
11 veiksmas: Apibrėžkite klasės kvadratą, kuris išplečia formą.
12 veiksmas: Pridėkite apsaugotą egzemplioriaus kintamąjį, kurio tipas yra dvigubas pavadinimas side.
13 veiksmas: Apibrėžkite parametrizuotą konstruktorių, kuris paima tris int x, y ir double side tipo parametrus ir inicijuoja x, y ir šoninius egzempliorių kintamuosius naudojant super() raktinį žodį.
14 veiksmas: Įdiekite abstraktų metodą getArea() apskaičiuodami kvadrato plotą.
15 veiksmas: Apibrėžkite pagrindinę klasę.
16 veiksmas: Apibrėžkite statinį metodą, pavadintą main(), kuris yra programos įėjimo taškas.
17 veiksmas: Sukurkite apskritimo objektą naudodami parametrizuotą konstruktorių.
18 veiksmas: Atspausdinkite apskritimo objekto plotą ir padėtį atitinkamai naudodami getArea() ir printPosition() metodus.
19 veiksmas: Sukurkite kvadratinį objektą naudodami parametrinį konstruktorių.
20 veiksmas: Spausdinkite kvadratinio objekto plotą ir padėtį atitinkamai naudodami getArea() ir printPosition() metodus.
21 veiksmas: Programos pabaiga.
Įgyvendinimas:
Aukščiau nurodytų toliau nurodytų veiksmų įgyvendinimas
Failo pavadinimas: 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(); } }
Išvestis:
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. Kopijavimo konstruktorius: kopijavimo konstruktorius naudojamas kuriant naują objektą su tokiomis pat reikšmėmis kaip esamas objektas (t. y. elementas sukurtas anksčiau nei). Tai naudinga, kai reikia sukurti naują objektą, kuris gali būti jau esančio / egzistuojančio objekto kopija. Kopijavimo konstruktorius apibrėžiamas tik vienu argumentu arba vienu parametru, kuris yra identiškos klasės elementas. Tada konstruktorius sukuria naują objektą su tomis pačiomis reikšmėmis kaip ir parametrų objektas.
ALGORITMAS:
1 žingsnis: Paskelbkite abstrakčią klasę su egzempliorių kintamaisiais ir numatytuoju konstruktoriumi.
2 žingsnis: Apibrėžkite kopijos konstruktorių su identiško klasės tipo parametru.
runas in powershell
3 veiksmas: Kopijų konstruktoriuje iškvieskite superklasės kopijavimo konstruktorių naudodami super raktinį žodį, kad nukopijuotumėte egzempliorių kintamuosius iš parametro objekto į naują objektą.
4 veiksmas: Priskirkite bet kokių papildomų egzempliorių kintamųjų reikšmes poklasyje naujam elementui.
5 veiksmas: Norėdami apskaičiuoti plotą, taikykite abstraktų metodą.
6 veiksmas: Jei reikia, nustatykite kitus metodus.
7 veiksmas: Pagrindinėje funkcijoje sukurkite klasės objektą.
8 veiksmas: Jei reikia, nustatykite padėtį ir kitus egzempliorių kintamuosius.
9 veiksmas: Sukurkite naują objektą naudodami kopijavimo konstruktorių ir kaip parametrą pateikdami originalų elementą.
10 veiksmas: Spausdinkite tiek originalaus, tiek kopijuotų objektų sritį ir padėtį.
Įgyvendinimas:
Pirmiau minėtų veiksmų įgyvendinimas pateikiamas toliau
Failo pavadinimas: 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(); } }
Išvestis:
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)