जावा - अमूर्तता

शब्दकोश के अनुसार, abstractionघटनाओं के बजाय विचारों से निपटने का गुण है। उदाहरण के लिए, जब आप ई-मेल के मामले पर विचार करते हैं, तो जटिल विवरण जैसे कि ई-मेल भेजते ही क्या होता है, आपके ई-मेल सर्वर का उपयोग करने वाला प्रोटोकॉल उपयोगकर्ता से छिपा होता है। इसलिए, एक ई-मेल भेजने के लिए आपको केवल सामग्री टाइप करने की आवश्यकता है, रिसीवर के पते का उल्लेख करें, और भेजें पर क्लिक करें।

इसी तरह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, अमूर्तता उपयोगकर्ता से कार्यान्वयन विवरण छिपाने की एक प्रक्रिया है, केवल उपयोगकर्ता को कार्यक्षमता प्रदान की जाएगी। दूसरे शब्दों में, उपयोगकर्ता के पास इस बात की जानकारी होगी कि ऑब्जेक्ट इसके बजाय यह कैसे करता है।

जावा में, अमूर्त वर्गों और इंटरफेस का उपयोग करके अमूर्तता प्राप्त की जाती है।

सार वर्ग

एक वर्ग जिसमें शामिल है abstract इसकी घोषणा में कीवर्ड को अमूर्त वर्ग के रूप में जाना जाता है।

  • अमूर्त वर्ग में अमूर्त विधियाँ हो सकती हैं या नहीं , अर्थात, शरीर के बिना विधियाँ (सार्वजनिक शून्य प्राप्त) (;)

  • लेकिन, यदि किसी वर्ग में कम से कम एक सार पद्धति है, तो वह कक्षा है must सार घोषित किया जाए।

  • यदि किसी वर्ग को सार घोषित किया जाता है, तो उसे तत्काल नहीं किया जा सकता है।

  • एक अमूर्त वर्ग का उपयोग करने के लिए, आपको इसे दूसरे वर्ग से विरासत में प्राप्त करना होगा, इसमें अमूर्त विधियों को कार्यान्वयन प्रदान करना होगा।

  • यदि आपको एक अमूर्त वर्ग विरासत में मिला है, तो आपको इसमें सभी अमूर्त विधियों को कार्यान्वयन प्रदान करना होगा।

उदाहरण

यह खंड आपको अमूर्त वर्ग का एक उदाहरण प्रदान करता है। एक अमूर्त वर्ग बनाने के लिए, बस का उपयोग करेंabstract कक्षा घोषणा से पहले खोजशब्द।

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

आप देख सकते हैं कि अमूर्त तरीकों को छोड़कर कर्मचारी वर्ग जावा में सामान्य वर्ग के समान है। वर्ग अब सार है, लेकिन इसमें अभी भी तीन क्षेत्र, सात विधियां और एक निर्माणकर्ता है।

अब आप निम्न तरीके से कर्मचारी वर्ग को तत्काल करने की कोशिश कर सकते हैं -

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

जब आप उपरोक्त वर्ग को संकलित करते हैं, तो यह आपको निम्न त्रुटि देता है -

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

अमूर्त वर्ग का पालन

हम निम्न प्रकार से कंक्रीट वर्ग की तरह कर्मचारी वर्ग के गुणों को विरासत में दे सकते हैं -

उदाहरण

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

यहां, आप कर्मचारी वर्ग को तुरंत नहीं भेज सकते हैं, लेकिन आप वेतन वर्ग को त्वरित कर सकते हैं, और इस उदाहरण का उपयोग करके आप कर्मचारी वर्ग के सभी तीन क्षेत्रों और सात तरीकों का उपयोग कर सकते हैं जैसा कि नीचे दिखाया गया है।

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

यह निम्न परिणाम उत्पन्न करता है -

उत्पादन

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

सार विधियां

यदि आप एक वर्ग को किसी विशेष विधि से युक्त करना चाहते हैं, लेकिन आप चाहते हैं कि उस पद्धति का वास्तविक कार्यान्वयन बाल वर्गों द्वारा निर्धारित किया जाए, तो आप मूल कक्षा में इस पद्धति को एक सार के रूप में घोषित कर सकते हैं।

  • abstract कीवर्ड का उपयोग विधि को सार के रूप में घोषित करने के लिए किया जाता है।

  • आपको जगह देनी होगी abstract विधि घोषणा में विधि के नाम से पहले कीवर्ड।

  • एक अमूर्त विधि में एक विधि हस्ताक्षर है, लेकिन कोई विधि निकाय नहीं है।

  • घुंघराले ब्रेसिज़ के बजाय, एक अमूर्त विधि के अंत में एक अर्ध-बृहदान्त्र (;) होगा।

निम्नलिखित सार विधि का एक उदाहरण है।

उदाहरण

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

एक विधि को सार के रूप में घोषित करने के दो परिणाम हैं -

  • इस वर्ग को सार के रूप में घोषित किया जाना चाहिए।

  • वर्तमान वर्ग को विरासत में प्राप्त किसी भी वर्ग को या तो अमूर्त पद्धति को ओवरराइड करना चाहिए या खुद को अमूर्त घोषित करना चाहिए।

Note- अंततः, एक वंशज वर्ग को अमूर्त पद्धति को लागू करना होगा; अन्यथा, आपके पास अमूर्त वर्गों का एक पदानुक्रम होगा जिसे तत्काल नहीं किया जा सकता है।

मान लें कि वेतन वर्ग कर्मचारी वर्ग को विरासत में मिला है, तो इसे लागू करना चाहिए computePay() नीचे दिखाए अनुसार विधि -

/* 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
}