Latest web development tutorials

clases abstractas Java

En concepto orientado a objetos, todos los objetos se describen por tipo, pero por el contrario, no todas las clases se usan para describir el objeto, el objeto si una clase no contiene suficiente información para describir una específica tal clase es una clase abstracta.

Además de la clase abstracta no puede ser instanciado objetos, todavía existen las otras clases funcionales, la forma de acceder a los miembros de las variables, los métodos y constructores de los miembros y la misma categoría general.

Desde la clase abstracta no puede ser instanciada objeto, por lo que la clase abstracta debe ser heredado, que puede ser utilizado. Por esta razón también, por lo general se determina en la etapa de diseño o no para diseñar una clase abstracta.

clase padre contiene un conjunto de subclase común, pero debido a la clase padre sí es abstracta, no se puede utilizar estos métodos.


clase abstracta

Se utiliza para definir la clase abstracta clase abstracta en el lenguaje Java. Los siguientes ejemplos:

/* 文件名 : 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;
   }
}

Tomando nota de que la clase de empleado no es diferente, aunque la clase es una clase abstracta, pero todavía tiene tres variables miembro, métodos y siete miembros de un constructor. Ahora bien, si se intenta el siguiente ejemplo:

/* 文件名 : 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();
    }
}

Cuando intenta compilar la clase AbstractDemo, se producirá el error siguiente:

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

herencia de clase abstracta

Nuestro enfoque general heredada por la clase 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;
   }
}

Si bien no podemos crear una instancia de un objeto de clase Empleado, pero si una instancia de un objeto de clase que hereda de salario las variables de la clase Empleado y tres miembros de los siete miembros del método.

/* 文件名 : 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();
    }
}

El programa anterior se compila resultados son los siguientes:

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.

método abstracto

Si desea diseñar una clase que contiene un método miembro específico, la implementación específica del método se determina por sus subclases, entonces se puede declarar el método de la clase padre es un método abstracto.

Del mismo modo palabra clave abstracta puede utilizarse para declarar métodos abstractos, métodos abstractos contienen sólo un nombre de método, y ningún cuerpo de método.

método abstracto no está definido, directamente detrás del nombre del método con un punto y coma en lugar de llaves.

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

Declarar métodos abstractos se traducirá en los dos resultados siguientes:

  • Si una clase contiene métodos abstractos, la clase debe ser abstracta.
  • Cualquier subclase debe reemplazar los métodos abstractos de la clase padre, o declararse abstracta.

Heredados métodos abstractos subclases deben reemplazar este método. De lo contrario, la subclase debe ser declarado como una clase abstracta. En última instancia, debe haber subclases para implementar el método abstracto, de lo contrario, desde la inicial a la subclase última clase padre no se puede utilizar para una instancia del objeto.

Si el nivel de sueldo que hereda la clase de empleado, se debe implementar el método 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;
   }

   //其余代码
}