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

एब्स्ट्रैक्ट क्लास और इंटरफेस में अंतर


एक एब्स्ट्रैक्ट क्लास में इंस्टेंस मेथड्स हो सकते हैं जो डिफ़ॉल्ट व्यवहार लागू करते हैं। एक इंटरफेस केवल कॉन्स्टेंट्स और इंस्टेंस मेथड्स घोषित कर सकता है, लेकिन डिफ़ॉल्ट व्यवहार लागू नहीं कर सकता और सभी मेथड्स अंतर्निहित रूप से एब्स्ट्रैक्ट होते हैं। एक इंटरफेस के सभी मेंबर्स पब्लिक होते हैं और कोई कार्यान्वयन नहीं होता।

विस्तृत तुलना

विशेषताएब्स्ट्रैक्ट क्लासइंटरफेस
कीवर्डabstract classinterface
मेथड्सएब्स्ट्रैक्ट + कंक्रीट (कार्यान्वयन के साथ)Java 7: केवल एब्स्ट्रैक्ट
Java 8+: डिफ़ॉल्ट/स्टेटिक मेथड्स भी
फील्ड्स (वेरिएबल्स)इंस्टेंस + स्टेटिक, कोई भी मॉडिफायरकेवल public static final (कॉन्स्टेंट्स)
कंस्ट्रक्टरहां (सबक्लास द्वारा चेनिंग के लिए)नहीं
इंस्टेंशिएशननहीं (लेकिन कंस्ट्रक्टर होता है)नहीं
विरासतextends (केवल एक)implements (एकाधिक)
एक्सेस मॉडिफायरकोई भी (private, protected, आदि)मेथड्स अंतर्निहित रूप से public
स्थिति (State)रख सकता है (इंस्टेंस वेरिएबल्स)नहीं रख सकता (केवल कॉन्स्टेंट्स)
उद्देश्य"IS-A" संबंध, कोड साझाकरण"CAN-DO" क्षमता, अनुबंध

कोड उदाहरण

एब्स्ट्रैक्ट क्लास

abstract class Animal {
    // स्टेट (इंस्टेंस वेरिएबल)
    protected String name;
    protected int age;
    
    // कंस्ट्रक्टर
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // कंक्रीट मेथड (कार्यान्वयन के साथ)
    public void eat() {
        System.out.println(name + " is eating");
    }
    
    // एब्स्ट्रैक्ट मेथड (कार्यान्वयन के बिना)
    public abstract void makeSound();
    
    // फाइनल मेथड (ओवरराइड नहीं किया जा सकता)
    public final void sleep() {
        System.out.println(name + " is sleeping");
    }
}

class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

इंटरफेस

interface Flyable {
    // कॉन्स्टेंट्स (अंतर्निहित public static final)
    int MAX_ALTITUDE = 10000;
    
    // एब्स्ट्रैक्ट मेथड (अंतर्निहित public abstract)
    void fly();
    
    // डिफ़ॉल्ट मेथड (Java 8+)
    default void land() {
        System.out.println("Landing...");
    }
    
    // स्टेटिक मेथड (Java 8+)
    static boolean canFly(String animalType) {
        return !"penguin".equalsIgnoreCase(animalType);
    }
}

class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Flying high!");
    }
    
    // land() डिफ़ॉल्ट उपयोग कर सकता है या ओवरराइड कर सकता है
}

कब क्या उपयोग करें?

एब्स्ट्रैक्ट क्लास का उपयोग करें जब:

  • क्लासेस के बीच कोड साझा करना हो (DRY सिद्धांत)
  • सामान्य स्टेट (फील्ड्स) हो
  • कंस्ट्रक्टर लॉजिक चाहिए
  • टेम्पलेट मेथड पैटर्न लागू करना हो
  • निकट से संबंधित क्लासेस हों (IS-A संबंध)

इंटरफेस का उपयोग करें जब:

  • अनुबंध/क्षमता परिभाषित करना हो (CAN-DO)
  • मल्टीपल इम्प्लीमेंटेशन संभव हो
  • असंबंधित क्लासेस सामान्य व्यवहार साझा करें
  • मल्टीपल इम्प्लीमेंटेशन की आवश्यकता हो
  • API डिजाइन करना हो (पब्लिक कॉन्ट्रैक्ट)

संयोजन: दोनों का उपयोग

// बेस एब्स्ट्रैक्ट क्लास - सामान्य कोड/स्टेट
abstract class AbstractVehicle {
    protected String brand;
    protected int year;
    
    public AbstractVehicle(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }
    
    public abstract void start();
}

// इंटरफेस - क्षमताएं
interface Electric {
    void charge();
    default int getBatteryLevel() { return 100; }
}

interface Autonomous {
    void enableAutopilot();
}

// कंक्रीट क्लास - दोनों का उपयोग
class Tesla extends AbstractVehicle implements Electric, Autonomous {
    public Tesla(int year) {
        super("Tesla", year);
    }
    
    @Override
    public void start() { System.out.println("Silent start"); }
    
    @Override
    public void charge() { System.out.println("Charging..."); }
    
    @Override
    public void enableAutopilot() { System.out.println("Autopilot on"); }
}

निष्कर्ष: एब्स्ट्रैक्ट क्लास "क्या है" (IS-A) और कोड साझाकरण के लिए है। इंटरफेस "क्या कर सकता है" (CAN-DO) और अनुबंध के लिए है। आधुनिक Java में डिफ़ॉल्ट/स्टेटिक मेथड्स के साथ इंटरफेस अधिक शक्तिशाली हो गए हैं, लेकिन एब्स्ट्रैक्ट क्लास स्टेट और कंस्ट्रक्टर लॉजिक के लिए अभी भी आवश्यक हैं।

  1. - Java में इनहेरिटेंस और कंपोजिशन के बीच अंतर

    कंपोजिशन एक डिज़ाइन तकनीक है जिसमें आपकी क्लास में दूसरी क्लास का इंस्टेंस आपकी क्लास के फील्ड के रूप में हो सकता है। इनहेरिटेंस एक मैकेनिज्म है जिसके तहत एक ऑब्जेक्ट क्लास को एक्सटेंड करके पैरेंट ऑब्जेक्ट के गुण और व्यवहार प्राप्त कर सकता है। कंपोजिशन और इनहेरिटेंस दोनों क्लास को संबंधित करके कोड

  1. - जावा में Thread और Runnable के बीच अंतर

    थ्रेड एक्जीक्यूशन का नया थ्रेड बनाने के दो तरीके हैं। एक है Thread क्लास का सबक्लास घोषित करना। इस सबक्लास को Thread क्लास के run मेथड को ओवरराइड करना चाहिए। सबक्लास का इंस्टेंस तब एलोकेट और स्टार्ट किया जा सकता है। थ्रेड बनाने का दूसरा तरीका है Runnable इंटरफेस को इम्प्लीमेंट करने वाली क्लास घोषित

  1. - Java में एब्सट्रैक्ट क्लास कब उपयोग करें और इंटरफेस कब उपयोग करें?

    एक इंटरफेस का उपयोग कॉन्ट्रैक्ट बिहेवियर को परिभाषित करने के लिए किया जा सकता है और यह दो सिस्टम्स के बीच इंटरैक्ट करने के लिए कॉन्ट्रैक्ट के रूप में भी कार्य कर सकता है जबकि एक एब्सट्रैक्ट क्लास मुख्य रूप से सबक्लासेस के लिए डिफ़ॉल्ट बिहेवियर को परिभाषित करने के लिए उपयोग की जाती है, इसका अर्थ है