Java - Soyutlama

Sözlüğe göre, abstractionolaylardan çok fikirlerle uğraşmanın kalitesidir. Örneğin, e-postayı düşündüğünüzde, bir e-posta gönderir göndermez ne olacağı gibi karmaşık ayrıntılar, e-posta sunucunuzun kullandığı protokol kullanıcıdan gizlenir. Bu nedenle, bir e-posta göndermek için, içeriği yazmanız, alıcının adresini belirtmeniz ve gönder'i tıklamanız yeterlidir.

Aynı şekilde nesne yönelimli programlamada da soyutlama, uygulama detaylarını kullanıcıdan gizleme sürecidir, kullanıcıya sadece işlevsellik sağlanacaktır. Başka bir deyişle, kullanıcı nesnenin nasıl yaptığı yerine ne yaptığı bilgisine sahip olacaktır.

Java'da soyutlama, Soyut sınıflar ve arayüzler kullanılarak gerçekleştirilir.

Soyut Sınıf

İçeren bir sınıf abstract bildirimindeki anahtar kelime soyut sınıf olarak bilinir.

  • Soyut sınıflar soyut yöntemler içerebilir veya içermeyebilir , yani gövdesiz yöntemler (public void get ();)

  • Ancak, bir sınıfın en az bir soyut yöntemi varsa, o zaman sınıf must soyut ilan edilecektir.

  • Bir sınıf soyut olarak bildirilmişse, somutlaştırılamaz.

  • Soyut bir sınıfı kullanmak için, onu başka bir sınıftan devralmanız, içindeki soyut yöntemlere uygulamalar sağlamanız gerekir.

  • Soyut bir sınıfı miras alırsanız, içindeki tüm soyut yöntemlere uygulamalar sağlamanız gerekir.

Misal

Bu bölüm size soyut sınıfın bir örneğini sunar. Soyut bir sınıf oluşturmak için,abstract sınıf bildiriminde, class anahtar sözcüğünden önce anahtar kelime.

/* File name : 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;
   }
}

Soyut yöntemler dışında Employee sınıfının Java'daki normal sınıfla aynı olduğunu gözlemleyebilirsiniz. Sınıf artık soyuttur, ancak yine de üç alana, yedi yönteme ve bir yapıcıya sahiptir.

Şimdi Employee sınıfını aşağıdaki şekilde başlatmayı deneyebilirsiniz -

/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      /* Following is not allowed and would raise error */
      Employee e = new Employee("George W.", "Houston, TX", 43);
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Yukarıdaki sınıfı derlediğinizde size şu hatayı verir -

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

Soyut Sınıfı Devralma

Employee sınıfının özelliklerini somut sınıf gibi aşağıdaki şekilde miras alabiliriz -

Misal

/* File name : 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;
   }
}

Burada, Employee sınıfını örnekleyemezsiniz, ancak Maaş Sınıfını başlatabilirsiniz ve bu örneği kullanarak, aşağıda gösterildiği gibi Employee sınıfının üç alanına ve yedi yöntemine erişebilirsiniz.

/* File name : 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();
   }
}

Bu, aşağıdaki sonucu verir -

Çıktı

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.0

Soyut Yöntemler

Bir sınıfın belirli bir yöntemi içermesini istiyorsanız, ancak bu yöntemin gerçek uygulamasının alt sınıflar tarafından belirlenmesini istiyorsanız, yöntemi ana sınıfta bir soyut olarak bildirebilirsiniz.

  • abstract anahtar kelime yöntemi soyut olarak bildirmek için kullanılır.

  • Yerleştirmelisin abstract yöntem bildiriminde yöntem adından önce anahtar kelime.

  • Soyut bir yöntem, bir yöntem imzası içerir ancak yöntem gövdesi içermez.

  • Küme parantezleri yerine, soyut bir yöntemin sonunda bir semoi iki nokta üst üste (;) olacaktır.

Aşağıda soyut yönteme bir örnek verilmiştir.

Misal

public abstract class Employee {
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   // Remainder of class definition
}

Bir yöntemi soyut olarak bildirmenin iki sonucu vardır:

  • Onu içeren sınıf soyut olarak ilan edilmelidir.

  • Geçerli sınıfı miras alan herhangi bir sınıf, soyut yöntemi geçersiz kılmalıdır veya kendini soyut olarak bildirmelidir.

Note- Sonunda, soyundan gelen bir sınıfın soyut yöntemi uygulaması gerekir; aksi takdirde, somutlaştırılamayan bir soyut sınıflar hiyerarşisine sahip olursunuz.

Salary sınıfının Employee sınıfını miras aldığını ve ardından computePay() aşağıda gösterildiği gibi yöntem -

/* File name : 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;
   }
   // Remainder of class definition
}