Latest web development tutorials

Java klasy abstrakcyjne

W koncepcji obiektowego, wszystkie obiekty są opisane według typu, ale odwrotnie, nie wszystkie klasy są używane do opisania obiektu, obiekt jeśli klasa nie zawiera wystarczających informacji, aby opisać konkretny taka klasa jest klasą abstrakcyjną.

Oprócz abstrakcyjnej klasie nie może być instancja obiektów, pozostałe klasy funkcjonalne nadal istnieją, tak aby uzyskać dostęp do Państw zmiennych, metod i konstruktorów z członków oraz samej kategorii ogólnej.

Ponieważ klasa abstrakcyjna nie może być instancja obiektu, a więc klasa abstrakcyjna musi być dziedziczone, to mogą być użyte. Również z tego powodu, zazwyczaj określany na etapie projektowania lub nie zaprojektować streszczenie klasy.

klasa nadrzędna zawiera zestaw wspólnych podklasy, ale ze względu na klasy nadrzędnej sama jest abstrakcyjny, nie mogą korzystać z tych metod.


Klasa abstrakcyjna

Służy do zdefiniowania klasy abstrakcyjnej klasy abstrakcyjnej w języku Java. Następujące przykłady:

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

Zwracając uwagę, że klasa Pracownik nie jest inaczej, choć klasa jest klasą abstrakcyjną, ale nadal ma trzy zmienne składowe, metody i siedmiu członków konstruktora. Teraz jeśli spróbujesz następujący przykład:

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

Przy próbie kompilacji klasy AbstractDemo, będzie produkować następujący błąd:

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

Klasa abstrakcyjna dziedziczenie

Nasze ogólne podejście dziedziczona przez klasę 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;
   }
}

Chociaż nie możemy instancję obiekt klasy Employee, ale jeśli mamy instancję obiektu klasy Wynagrodzenie, która dziedziczy z klasy zmiennych pracownicze oraz trzech członków siedmiu członków tej metody.

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

Powyższy program opracowano następujące wyniki:

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.

Streszczenie Sposób

Jeśli chcesz zaprojektować klasę, która zawiera określoną metodę członkowskim, konkretna realizacja metody jest określana przez jej podklasy, a następnie można zadeklarować metody w klasie nadrzędnej jest abstrakcyjna metoda.

Podobnie Streszczenie kluczowe mogą być wykorzystywane do deklarowania metody abstrakcyjne, abstrakcyjne metody zawierać tylko nazwę metody, a nie ciało metody.

Streszczenie metoda nie jest zdefiniowana, bezpośrednio za nazwą metody z średnikiem zamiast nawiasów klamrowych.

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

Zadeklarować metody abstrakcyjne spowoduje następujących wyników:

  • Jeśli klasa zawiera metody abstrakcyjne, klasa musi być abstrakcyjne.
  • Każda podklasa musi zastąpić abstrakcyjnych metod klasy nadrzędnej lub uzna się abstrakcyjne.

Dziedziczone metody abstrakcyjne podklasy należy zastąpić tę metodę. W przeciwnym razie podklasa musi być zadeklarowany jako klasy abstrakcyjnej. Ostatecznie muszą być podklas realizacji streszczenie sposobu, w przeciwnym wypadku, z położenia początkowego do końcowego klasy nadrzędnej podklasy nie może być stosowany do wystąpienia obiektu.

Jeśli klasa dziedziczy klasę Wynagrodzenie pracownika, musi wdrożyć metody 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;
   }

   //其余代码
}