Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java में एब्स्ट्रैक्ट मेथड और क्लासेस


हां। हम Java में एब्स्ट्रैक्ट मेथड/क्लासेस बहुत आसानी से बना सकते हैं।

उदाहरण

एक एब्स्ट्रैक्ट क्लास बनाने के लिए, क्लास डिक्लेरेशन में class कीवर्ड से पहले 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; }
}

आप देख सकते हैं कि एब्स्ट्रैक्ट मेथड्स को छोड़कर Employee क्लास Java में सामान्य क्लास के समान है। क्लास अब एब्स्ट्रैक्ट है, लेकिन इसमें अभी भी तीन फील्ड्स, सात मेथड्स, और एक कंस्ट्रक्टर है।

एब्स्ट्रैक्ट क्लास की मुख्य विशेषताएं

  • abstract कीवर्ड के साथ घोषित
  • इंस्टेंशिएट नहीं किया जा सकता (new Employee() अवैध)
  • एब्स्ट्रैक्ट मेथड्स हो सकते हैं (बॉडी के बिना)
  • कंक्रीट मेथड्स हो सकते हैं (कार्यान्वयन के साथ)
  • इंस्टेंस वेरिएबल्स, कंस्ट्रक्टर्स, स्टेटिक मेंबर्स हो सकते हैं
  • सबक्लास द्वारा एक्सटेंड किया जाना चाहिए
  • सबक्लास को सभी एब्स्ट्रैक्ट मेथड्स इम्प्लीमेंट करने चाहिए (जब तक सबक्लास भी एब्स्ट्रैक्ट न हो)

एब्स्ट्रैक्ट मेथड

// एब्स्ट्रैक्ट मेथड - कोई बॉडी नहीं, सेमीकॉलन से समाप्त
public abstract void computePay();

// या
abstract double calculateBonus();

एब्स्ट्रैक्ट क्लास को इंस्टेंशिएट करने का प्रयास

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

कंपाइल त्रुटि

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

सही उपयोग: सबक्लास बनाना

// कंक्रीट सबक्लास
public class SalariedEmployee extends Employee {
    private double salary;
    
    public SalariedEmployee(String name, String address, int number, double salary) {
        super(name, address, number);
        this.salary = salary;
    }
    
    @Override
    public double computePay() {
        System.out.println("Inside SalariedEmployee computePay");
        return salary / 12; // मासिक वेतन
    }
}

// उपयोग
public class TestEmployee {
    public static void main(String[] args) {
        // Employee e = new Employee(...); // ERROR
        Employee e = new SalariedEmployee("John", "NYC", 101, 120000);
        System.out.println("Monthly Pay: " + e.computePay()); // पॉलीमॉर्फिज्म
        e.mailCheck();
    }
}

एब्स्ट्रैक्ट क्लास vs इंटरफेस (त्वरित तुलना)

विशेषताएब्स्ट्रैक्ट क्लासइंटरफेस (Java 8+)
एब्स्ट्रैक्ट मेथड्सहांहां
कंक्रीट मेथड्सहांहां (default/static)
इंस्टेंस फील्ड्सहांनहीं
कंस्ट्रक्टरहांनहीं
मल्टीपल इम्प्लीमेंटेशननहीं (single extends)हां (multiple implements)
एक्सेस मॉडिफायरकोई भीpublic (डिफ़ॉल्ट)

टेम्पलेट मेथड पैटर्न (एब्स्ट्रैक्ट क्लास का क्लासिक उपयोग)

abstract class DataProcessor {
    // टेम्पलेट मेथड - फाइनल ताकि ओवरराइड न हो
    public final void process() {
        readData();
        processData();
        writeData();
    }
    
    // हुक मेथड्स - सबक्लास द्वारा इम्प्लीमेंट
    protected abstract void readData();
    protected abstract void processData();
    protected abstract void writeData();
    
    // वैकल्पिक हुक
    protected void beforeProcess() {}
    protected void afterProcess() {}
}

class CSVProcessor extends DataProcessor {
    @Override
    protected void readData() { /* CSV पढ़ें */ }
    
    @Override
    protected void processData() { /* प्रोसेस करें */ }
    
    @Override
    protected void writeData() { /* लिखें */ }
}

निष्कर्ष: एब्स्ट्रैक्ट क्लास सामान्य कोड/स्टेट साझा करने और टेम्पलेट लागू करने के लिए आधार प्रदान करती है। इसे इंस्टेंशिएट नहीं किया जा सकता लेकिन सबक्लास द्वारा एक्सटेंड किया जाता है जो एब्स्ट्रैक्ट मेथड्स को इम्प्लीमेंट करते हैं।

  1. - Java में Static Binding और Dynamic Binding

    हां! जब कंपाइलर जानता है कि मेथड निष्पादन के लिए किन ऑब्जेक्ट्स का उपयोग किया जाना है, तो यह रेफरेंस को ऑब्जेक्ट से स्टैटिकली बाइंड कर सकता है। उदाहरण के लिए, स्टैटिक वेरिएबल्स, प्राइवेट, फाइनल वेरिएबल्स स्टैटिक बाइंडिंग का उपयोग कर रहे हैं। जबकि यदि ऑब्जेक्ट पहचान रनटाइम पर की जानी है तो डायनामिक ब

  1. - Java में Packages (पैकेजेस)

    Java में पैकेजेस का उपयोग नामकरण संघर्षों को रोकने, एक्सेस नियंत्रित करने, क्लासेज, इंटरफेस, एन्यूमरेशन और एनोटेशन की खोज/पता लगाने और उपयोग को आसान बनाने के लिए किया जाता है।एक पैकेज को संबंधित टाइप्स (क्लासेज, इंटरफेस, एन्यूमरेशन और एनोटेशन) के समूह के रूप में परिभाषित किया जा सकता है जो एक्सेस सु

  1. - Java में toString() को ओवरराइड क्यों करें: ऑब्जेक्ट प्रतिनिधित्व बढ़ाना

    Java में toString() मेथड का उद्देश्य क्या है? यदि हम किसी क्लास के ऑब्जेक्ट को String के रूप में दर्शाना चाहते हैं, तो हम toString() मेथड का उपयोग कर सकते हैं जो ऑब्जेक्ट का टेक्स्टुअल प्रतिनिधित्व लौटाता है। जब आप किसी ऑब्जेक्ट को प्रिंट करते हैं, तो डिफ़ॉल्ट रूप से Java कंपाइलर ऑब्जेक्ट पर toStrin