Abstraction in Java
What is Abstraction?
Abstraction is the process of hiding internal implementation details and showing only the essential features to the user.
- 
        Think of it like using a car:
        
 - You use the steering wheel and accelerator…
 - But you don’t need to know how the engine or fuel injection system works!
 
How is Abstraction Achieved in Java?
Java provides two ways to achieve abstraction:
| Tool | Description | 
|---|---|
| Abstract Classes | Partial abstraction (can have both abstract and concrete methods) | 
| Interfaces | Full abstraction (Java 8+ allows default methods too) | 
Abstract Class
An abstract class cannot be instantiated. It may contain abstract methods (no body) and concrete methods (with body).
Syntax:
    
    abstract class Shape {
        abstract void draw();  // abstract method
        void display() {
            System.out.println("Displaying shape...");
        }
    }
    class Circle extends Shape {
                @Override
        void draw() {
            System.out.println("Drawing Circle");
        }
    }
    
    
    Usage:
    
    public class Main {
        public static void main(String[] args) {
            Shape s = new Circle();  // Abstract class reference to concrete class
            s.draw();
            s.display();
        }
    }
    
    
    Output:
    
    Drawing Circle  
    Displaying shape...
    
    
    Interface
An interface is a contract — any class that implements it must provide definitions for all its methods.
Syntax:
    
    interface Animal {
        void makeSound();  // implicitly public and abstract
    }
    class Dog implements Animal {
        public void makeSound() {
            System.out.println("Dog barks");
        }
    }
    
    
    Usage:
    
    public class Main {
        public static void main(String[] args) {
            Animal a = new Dog();
            a.makeSound();
        }
    }
    
    
    Output:
    
    Dog barks
    
    
    Abstract Class vs Interface
| Feature | Abstract Class | Interface | 
|---|---|---|
| Methods | Can have both abstract and normal methods | Only abstract methods (Java 8+ allows default/static) | 
| Variables | Can have instance variables | Only constants (public static final) | 
| Inheritance | Supports single inheritance | Supports multiple inheritance | 
| Constructor | Yes | No | 
Why Use Abstraction?
- Hide complexity
 - Improve modularity
 - Enhance code readability
 - Encourage loose coupling
 
Real-World Analogy
- 
        Using an ATM:
        
 - You press buttons (interface)
 - Internally, it accesses your account, verifies PIN, updates the database (implementation)
 
You don't need to know how all of that works — that’s abstraction!