Latest web development tutorials

Java classi astratte

Nel concetto orientato agli oggetti, tutti gli oggetti vengono descritti in base al tipo, ma al contrario, non tutte le classi sono utilizzate per descrivere l'oggetto, l'oggetto se una classe non contiene informazioni sufficienti per descrivere una specifica tale classe è una classe astratta.

In aggiunta alla classe astratta non può essere istanziati oggetti, esistono ancora delle altre classi funzionali, il modo per accedere ai membri variabili, metodi e costruttori dei membri e alla stessa categoria generale.

Poiché la classe astratta non può essere istanziata oggetto, quindi la classe abstract deve essere ereditata, può essere utilizzato. Anche per questo motivo, di solito determinato in fase di progettazione o di non progettare una classe astratta.

classe padre contiene una serie di sottoclasse comune, ma a causa della classe madre stessa è astratta, non è possibile utilizzare questi metodi.


classe astratta

Consente di definire classe astratta classe astratta nel linguaggio Java. I seguenti esempi:

/* 文件名 : Employee.java */
public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public double computePay()
   {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
   public String toString()
   {
      return name + " " + address + " " + number;
   }
   public String getName()
   {
      return name;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

Notando che la classe Employee non è diverso, anche se la classe è una classe astratta, ma ha ancora tre variabili membro, metodi e sette membri di un costruttore. Ora, se si prova il seguente esempio:

/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      /* 以下是不允许的,会引发错误 */
      Employee e = new Employee("George W.", "Houston, TX", 43);

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

Quando si tenta di compilare classe AbstractDemo, produrrà il seguente errore:

Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

Estratto eredità di classe

Il nostro approccio generale ereditata dalla classe Employee:

/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

Anche se non siamo in grado di istanziare un oggetto della classe Employee, ma se un'istanza di un oggetto di classe stipendio che eredita dalle variabili di classe dipendenti e tre membri dei sette membri del metodo.

/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

Il programma precedente viene compilato risultati sono i seguenti:

Constructing an Employee
Constructing an Employee
Call mailCheck using  Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.

metodo astratto

Se si vuole progettare una classe che contiene un metodo membro specifico, l'attuazione specifica del metodo è determinata dalle sue sottoclassi, allora si può dichiarare il metodo nella classe padre è un metodo astratto.

Allo stesso modo astratta parola chiave può essere utilizzato per dichiarare metodi astratti, metodi astratti contengono solo un nome di metodo, e nessun corpo del metodo.

metodo astratto non è definito, direttamente dietro il nome del metodo con un punto e virgola al posto di parentesi graffe.

public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   
   //其余代码
}

Dichiarare metodi astratti si tradurrà in due risultati seguenti:

  • Se una classe contiene metodi astratti, la classe deve essere astratta.
  • Ogni sottoclasse deve sostituire i metodi astratti della classe genitore, o dichiararsi astratto.

Ereditati metodi astratti sottoclassi devono avere la precedenza questo metodo. In caso contrario, la sottoclasse deve essere dichiarato come una classe astratta. In definitiva, ci deve essere sottoclassi per implementare il metodo astratto, altrimenti, dalla iniziale al finale sottoclasse classe genitore non può essere utilizzato per creare un'istanza dell'oggetto.

Se la classe di stipendio eredita la classe Employee, si deve implementare il metodo computePay ():

/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; // Annual salary
  
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }

   //其余代码
}