# एब्स्ट्रैक्ट क्लास व इंटरफ़ेस — कोर जावा

Source: https://www.geekswithgeeks.com/hi/core-java/java-abstract-interface

> एब्स्ट्रैक्ट क्लास और इंटरफ़ेस में चुनें, default मेथड से व्यवहार जोड़ें, और Comparable व Runnable जैसी क्षमताएँ मॉडल करें।

## कौन-सा कब

**इंटरफ़ेस** शुद्ध कॉन्ट्रैक्ट है — कई लागू कर सकते हैं। **एब्स्ट्रैक्ट क्लास** स्टेट रख सकती है पर एक ही एक्सटेंड होती है।

## default वाला इंटरफ़ेस

Java 8 से इंटरफ़ेस `default` मेथड बॉडी दे सकता है, इसलिए नया मेथड मौजूदा इम्प्लीमेंटर को नहीं तोड़ता।

```java
interface Shape {
    double area();
    default String describe() {
        return "area = " + area();
    }
}
class Circle implements Shape {
    private final double r;
    Circle(double r) { this.r = r; }
    public double area() { return Math.PI * r * r; }
}
```

## static व private इंटरफ़ेस मेथड

Java 8 से इंटरफ़ेस में `static` मेथड हो सकते हैं (इंटरफ़ेस पर सीधे बुलाए जाते हैं, जैसे `Shape.unitCircle()`)। Java 9 से `private` मेथड default मेथड्स को हेल्पर कोड साझा करने देते हैं बिना इम्प्लीमेंटर को दिखाए।

```java
interface Shape {
    double area();

    static Shape unitCircle() { return new Circle(1); }

    private String label() { return "Shape["; }
    default String describe() { return label() + area() + "]"; }
}
```
