Latest web development tutorials

자바 추상 ​​클래스

객체 지향 개념에서 모든 개체 유형별로 설명되어 있지만, 반대로, 모든 클래스 오브젝트를 설명하기 위해 사용 된 것으로, 객체 클래스는 구체적인 설명을하기에 충분한 정보를 포함하지 않으면 이러한 클래스는 추상 클래스입니다.

추상 클래스 이외에, 다른 기능 클래스는 여전히 존재 멤버 변수, 메소드 및 부재 생성자와 같은 일반 카테고리에 액세스하는 방법을 객체 인스턴스화 될 수 없다.

추상 클래스는 객체를 인스턴스화 할 수 없기 때문에 추상 클래스를 상속해야하므로, 그것을 사용할 수 있습니다. 이 때문에, 일반적으로 설계 단계에서 결정되거나 추상 클래스를 설계하지.

상위 클래스는 일반적인 서브 클래스의 집합을 포함하지만, 부모 클래스 자체가 추상적 인 때문에, 당신은이 방법을 사용할 수 없습니다.


추상 클래스

자바 언어로 추상 클래스 추상 클래스를 정의하는 데 사용합니다. 다음 예 :

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

추상 클래스 상속

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;
   }
}

우리는 Employee 클래스 변수와 메소드의 일곱 멤버 3 명에서 상속 급여 클래스 개체를 인스턴스화하는 경우 우리는 클래스 직원의 개체를 인스턴스화 만 할 수는 없지만.

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

다음과 같은 두 가지 결과가 발생합니다 추상 메소드를 선언합니다 :

  • 클래스가 추상 메소드를 포함하는 경우, 클래스는 추상해야합니다.
  • 서브 클래스는 상위 클래스의 추상 메소드를 오버라이드 (override), 또는 추상 자체를 선언해야합니다.

상속 된 추상 메소드 서브 클래스는이 메소드를 오버라이드 (override)해야합니다. 그렇지 않으면, 서브 클래스는 추상 클래스로 선언해야합니다. 궁극적으로, 개체를 인스턴스화하는 데 사용할 수 없습니다 최종 상위 클래스의 서브 클래스로 초기부터, 그렇지 않으면 추상 메소드를 구현하는 서브 클래스가 있어야합니다.

급여 클래스는 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;
   }

   //其余代码
}