CodeGym /Java Blog /Random-IT /Metodo e classi astratte Java
John Squirrels
Livello 41
San Francisco

Metodo e classi astratte Java

Pubblicato nel gruppo Random-IT
I metodi astratti sono un potente strumento di Java e danno a questo linguaggio orientato agli oggetti ancora più capacità quando si tratta di polimorfismo. Un metodo astratto Java può essere utilizzato per creare un framework di base per un intero programma e consentire di apportare modifiche in base alle esigenze.Metodo astratto Java e tu - 1

Cos'è un metodo astratto?

Un metodo astratto è un metodo che non ha implementazione. Cioè, ha solo una dichiarazione, quindi conosci il nome, il tipo restituito e le variabili che accetterà. Ecco un esempio di un metodo astratto di base:

public abstract int example(int a1, int a2);
Quando guardi questo metodo, puoi dire che restituisce un numero intero e accetta due numeri interi come argomento. Quello che non puoi dire è come questo metodo è implementato. Questo perché per implementarlo, devi sovrascriverlo. Quando crei un metodo astratto in java, devi rispettare alcune linee guida o il tuo programma non verrà compilato correttamente. Ricordare:
  • I metodi astratti Java non hanno implementazione. Cioè, non dovrebbero mai essere seguiti da parentesi graffe e da un corpo che indichi come utilizzare il metodo. È appena terminato con un punto e virgola.

  • Se crei un metodo astratto, questo può essere inserito solo in una classe astratta. Cioè, non puoi avere una classe concreta che ha un metodo astratto al suo interno.
    io. Come nota a margine, se hai una classe astratta, può contenere costruttori. Tuttavia, non deve avere un metodo astratto.

  • Quando una classe concreta estende una classe astratta, deve anche implementare tutti i metodi astratti della classe genitore oppure non può essere concreta e deve essere dichiarata astratta.

Questi ultimi due potrebbero creare un po' di confusione, quindi chiariamolo subito.

Estensione di classi Java astratte

Diciamo che vogliamo scrivere un programma sulle forme base che restituirà perimetro e area. Quindi creiamo una classe astratta genitore. Ma poiché ogni forma ha le sue regole, ciascuna deve essere calcolata in modo diverso, quindi scriviamo la classe Shape astratta in questo modo:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Ora, se vogliamo effettivamente utilizzare questi metodi astratti, dobbiamo estendere la classe madre Java astratta Shape e quindi istanziare i metodi. Quindi ogni classe concreta deve implementare i metodi astratti area e perimetro.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
L'output dalla console è quindi simile a questo:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Si noti che la classe Quadrilateral non deve creare un'istanza del costruttore Shape(String name) dalla classe padre Shape . Questo perché non è un metodo astratto. Tuttavia, se hai implementato solo un'area o un perimetro in una classe, la nuova classe dovrebbe essere astratta perché non includeva entrambi. È inoltre possibile utilizzare metodi astratti in Interfacce.

Metodi Java astratti con interfacce

Rivediamo rapidamente cos'è un'interfaccia e in che modo differisce da una classe astratta. In un'interfaccia, tutte le variabili dichiarate in un'interfaccia sono public, static e final. Le classi astratte, d'altra parte, hanno solo variabili non finali. Tutto in un'interfaccia è pubblico per impostazione predefinita. Una classe astratta può avere private, protected, public, ecc. Infine, una classe non estende un'interfaccia, ma la implementa. Prima di JDK 8, un'interfaccia non poteva contenere altro che metodi astratti. Ora, un'interfaccia può avere metodi predefiniti e statici. Per questo motivo, le best practice si sono allontanate dall'utilizzo di metodi astratti come modelli estendibili e si sono concentrate sulle interfacce e sulla loro implementazione. Quindi, se dovessi creare Shape come interfaccia e poi implementarlo come Quadrilatero, come sarebbe? Innanzitutto, dovresti eliminare il costruttore Shape(String name) . Sembrerebbe così con solo i due metodi astratti:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
Infine, l'utilizzo del nuovo Quadrilatero in quanto implementa l' interfaccia Shape sarebbe più o meno lo stesso:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
E la stampa della console sarebbe simile a questa:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Se desideri approfondire le differenze tra interfacce e classi astratte, puoi trovare ulteriori informazioni qui.

Ma perché utilizzare metodi Java astratti?

Ci sono molte ragioni per cui vengono utilizzati metodi astratti in Java e perché dovresti sentirti a tuo agio nell'usarli. Ecco tre rapidi motivi per cui dovresti usarli quando è appropriato.
  1. Evita la duplicazione degli sforzi: guarda indietro al nostro esempio di codifica; immagina che tu e il tuo team aveste bisogno di creare classi per forme diverse da un rettangolo. Quanti modi diversi ci sono che potresti inventare per progettare quella classe? Dieci? Quindici? E questo è un problema semplice. Immagina qualcosa di molto più complesso. Tu e il tuo team potreste trovare centinaia di modi. Quindi dovresti affrontare l'arduo compito di intrecciarli insieme in un programma coerente. Questo ci porta al punto successivo: definire l'implementazione.

  2. I metodi astratti in Java consentono la definizione dell'uso e dell'implementazione: quando si utilizza una classe o un'interfaccia astratta e, in base alla progettazione, metodi astratti, si definisce il modo in cui le altre persone interagiranno con la propria interfaccia. Ciò consente loro di sapere quali variabili dovrebbero utilizzare e quali tipi di ritorno possono aspettarsi.
    Sebbene possano sovrascriverli e creare classi concrete che implementano la tua interfaccia in modi unici, fissi comunque l'uso principale del tuo codice. Se qualcuno vuole implementare Shape, deve sovrascrivere o implementare sia il perimetro che l'area.

  3. Leggibilità e debug: disporre di metodi astratti migliorerà la leggibilità del codice. Quando scrivi una classe che implementa un'interfaccia, sai cosa cercare. Sai che ogni metodo astratto nell'interfaccia sarà nell'implementazione e questo rende più facile leggere e rintracciare eventuali bug. I metodi astratti sono solo l'inizio dell'apprendimento di come utilizzare correttamente il polimorfismo in Java e in altri linguaggi orientati agli oggetti. Quando inizi a capirli e usarli, inizierà un capitolo completamente nuovo del tuo viaggio di programmazione.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION