Una classe que es declara amb la paraula clau abstracta es coneix com a classe abstracta a Java . Pot tenir mètodes abstractes i no abstractes (mètode amb el cos).
Abans d'aprendre la classe abstracta de Java, primer entenem l'abstracció a Java.
python snake vs anaconda
Abstracció a Java
Abstracció és un procés per ocultar els detalls de la implementació i mostrar només la funcionalitat a l'usuari.
D'altra manera, només mostra coses essencials a l'usuari i amaga els detalls interns, per exemple, enviant SMS on escriu el text i envia el missatge. No coneixeu el processament intern sobre el lliurament del missatge.
L'abstracció us permet centrar-vos en què és objecte fa en comptes de com ho fa.
Maneres d'aconseguir l'abstracció
Hi ha dues maneres d'aconseguir l'abstracció a Java
- Classe abstracta (0 a 100%)
- Interfície (100%)
Classe abstracta en Java
Una classe que es declara com a abstracta es coneix com a classe abstracta . Pot tenir mètodes abstractes i no abstractes. Cal ampliar-lo i implementar el seu mètode. No es pot instanciar.
Punts a recordar
- Una classe abstracta s'ha de declarar amb una paraula clau abstracta.
- Pot tenir mètodes abstractes i no abstractes.
- No es pot instanciar.
- Pot tenir constructors i mètodes estàtics també.
- Pot tenir mètodes finals que obligaran la subclasse a no canviar el cos del mètode.
Exemple de classe abstracta
abstract class A{}
Mètode abstracte en Java
Un mètode que es declara com a abstracte i no té implementació es coneix com a mètode abstracte.
Exemple de mètode abstracte
abstract void printStatus();//no method body and abstract
Exemple de classe abstracta que té un mètode abstracte
En aquest exemple, Bike és una classe abstracta que només conté una execució de mètodes abstractes. La seva implementació la proporciona la classe Honda.
abstract class Bike{ abstract void run(); } class Honda4 extends Bike{ void run(){System.out.println('running safely');} public static void main(String args[]){ Bike obj = new Honda4(); obj.run(); } }Prova-ho ara
running safely
Comprensió de l'escenari real de la classe abstracta
En aquest exemple, Shape és la classe abstracta, i la seva implementació la proporcionen les classes Rectangle i Circle.
Majoritàriament, no sabem sobre la classe d'implementació (que està oculta per a l'usuari final), i un objecte de la classe d'implementació és proporcionada per mètode de fàbrica .
Estructures de control Python
A mètode de fàbrica és un mètode que retorna la instància de la classe. Més endavant coneixerem el mètode de fàbrica.
En aquest exemple, si creeu la instància de la classe Rectangle, s'invocarà el mètode draw() de la classe Rectangle.
Fitxer: TestAbstraction1.java
abstract class Shape{ abstract void draw(); } //In real scenario, implementation is provided by others i.e. unknown by end user class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle');} } class Circle1 extends Shape{ void draw(){System.out.println('drawing circle');} } //In real scenario, method is called by programmer or user class TestAbstraction1{ public static void main(String args[]){ Shape s=new Circle1();//In a real scenario, object is provided through method, e.g., getShape() method s.draw(); } }Prova-ho ara
drawing circle
Un altre exemple de classe abstracta a Java
Fitxer: TestBank.java
abstract class Bank{ abstract int getRateOfInterest(); } class SBI extends Bank{ int getRateOfInterest(){return 7;} } class PNB extends Bank{ int getRateOfInterest(){return 8;} } class TestBank{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println('Rate of Interest is: '+b.getRateOfInterest()+' %'); b=new PNB(); System.out.println('Rate of Interest is: '+b.getRateOfInterest()+' %'); }}Prova-ho ara
Rate of Interest is: 7 % Rate of Interest is: 8 %
Classe abstracta amb constructor, membre de dades i mètodes
Una classe abstracta pot tenir un membre de dades, un mètode abstracte, un cos del mètode (mètode no abstracte), un constructor i fins i tot un mètode main().
Fitxer: TestAbstraction2.java
//Example of an abstract class that has abstract and non-abstract methods abstract class Bike{ Bike(){System.out.println('bike is created');} abstract void run(); void changeGear(){System.out.println('gear changed');} } //Creating a Child class which inherits Abstract class class Honda extends Bike{ void run(){System.out.println('running safely..');} } //Creating a Test class which calls abstract and non-abstract methods class TestAbstraction2{ public static void main(String args[]){ Bike obj = new Honda(); obj.run(); obj.changeGear(); } }Prova-ho ara
bike is created running safely.. gear changed
Regla: si hi ha un mètode abstracte en una classe, aquesta ha de ser abstracta.
class Bike12{ abstract void run(); }Prova-ho ara
compile time error
Regla: si esteu ampliant una classe abstracta que té un mètode abstracte, heu de proporcionar la implementació del mètode o fer que aquesta classe sigui abstracta.
Un altre escenari real de classe abstracta
La classe abstracta també es pot utilitzar per proporcionar alguna implementació del interfície . En aquest cas, és possible que l'usuari final no es vegi obligat a anul·lar tots els mètodes de la interfície.
Nota: si sou principiant a java, apreneu primer la interfície i ometeu aquest exemple.
interface A{ void a(); void b(); void c(); void d(); } abstract class B implements A{ public void c(){System.out.println('I am c');} } class M extends B{ public void a(){System.out.println('I am a');} public void b(){System.out.println('I am b');} public void d(){System.out.println('I am d');} } class Test5{ public static void main(String args[]){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }}Prova-ho ara
Output:I am a I am b I am c I am d