Latest web development tutorials

Java абстрактные классы

В объектно-ориентированной концепции, все объекты описываются по типу, но, наоборот, не все классы используются для описания объекта, объект, если класс не содержит достаточно информации для описания конкретного такой класс является абстрактным классом.

В дополнение к абстрактного класса не могут быть созданы объекты, другие функциональные классы до сих пор существуют, способ получить доступ к элементу переменные, методы и конструкторы членов и ту же общую категорию.

Поскольку абстрактный класс не может быть создан объект, так что абстрактный класс должен быть унаследован, он может быть использован. По этой же причине, как правило, определяется на стадии проектирования или не создавать абстрактный класс.

Родительский класс содержит набор общих подкласса, но из-за родительского класса само по себе является абстрактным, вы не можете использовать эти методы.


Абстрактный класс

Используйте для определения абстрактного класса абстрактного класса на языке Java. Ниже приведены примеры:

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

Принимая во внимание, что класс Employee ничем не отличается, хотя класс является абстрактным классом, но он по-прежнему имеет три переменных члена, методы и семь членов конструктора. Теперь, если вы попытаетесь следующий пример:

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

При попытке компиляции класса AbstractDemo, он будет производить следующее сообщение об ошибке:

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

Абстрактный класс наследования

Наш общий подход унаследовал по классу сотрудников:

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

В то время как мы не можем создать объект класса Employee, но если мы создаем объект класса, который наследует Зарплата от переменных класса Employee и трех членов семи членов метода.

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

Вышеприведенная программа компилируется получены следующие результаты:

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.

Абстрактный метод

Если вы хотите создать класс, который содержит конкретный метод члена, конкретная реализация метода определяется его подклассов, то вы можете объявить метод в родительском классе абстрактный метод.

Точно так же Аннотация ключевое слово можно использовать, чтобы объявить абстрактные методы, абстрактные методы содержат только имя метода, и нет тела метода.

Абстрактный метод не определен, непосредственно за именем метода точкой с запятой вместо фигурные скобки.

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

Объявите абстрактные методы приведут к следующим двум результатам:

  • Если класс содержит абстрактные методы, класс должен быть абстрактным.
  • Любой подкласс должен переопределить абстрактные методы родительского класса, или заявить о себе абстрактно.

Наследственные абстрактные методы подклассы должны переопределить этот метод. В противном случае подкласс должен быть объявлен как абстрактный класс. В конечном счете, должны быть подклассы реализовать абстрактный метод, в противном случае, от начального до конечного родительского класса подкласса не может быть использован для создания экземпляра объекта.

Если класс наследует зарплата класс Employee, он должен реализовать метод 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;
   }

   //其余代码
}