OOP

Object Oriented Programming is a programming paradigm that organizes data and behaviors into reusable and self-contained units called objects.

Class

A blueprint or template for creating objects.

public class Person {
    // Attributes (instance variables)
    String name;
    int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Method
    public void introduce() {
        System.out.println("Hello, I'm " + name + " and I'm " + age + " years old.");
    }
}

Object

Instance created from a class

Person person1 = new Person("Alice", 30);

Interface

A blueprint for a class that defines a set of methods (function signatures) that must be implemented by any concrete class that implements the interface

public interface Drawable {
    void draw();
}

Class implements Interface

'Circle implements Drawable' it means that the Circle class is declaring that it will adhere to a contract defined by the Drawable interface = It agrees to provide concrete implementations for all the methods declared in that interface.

// Interface representing drawable objects
public interface Drawable {
    void draw();
}

// Class implementing the Drawable interface
public class Circle implements Drawable {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

4 fundamental principles of OOP

  • Inheritence

  • Polymorphism

  • Encapsulation

  • Abstraction

Inheritence

Child inherits parent's properties and methods ("is a" relationship)

public class Student extends Person {
    String studentId;

    public Student(String name, int age, String studentId) {
        super(name, age); // Use parent contructor
        this.studentId = studentId;
    }
}

Polymorphism

"many forms" in OOP

// Shape is an abstract class or interface with a draw method.
interface Shape {
    void draw();
}

// Circle is a concrete class that implements the Shape interface.
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle.");
    }
}

// Rectangle is a concrete class that implements the Shape interface.
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle.");
    }
}

Can just use their abstract type "Shape" instead of actual Shape

public class PolymorphismExample {
    public static void main(String[] args) {
        // Create instances of Circle and Rectangle.
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();

        // Use polymorphism to call the draw method on both objects.
        circle.draw();    // Output: "Drawing a circle."
        rectangle.draw(); // Output: "Drawing a rectangle."

        // You can store different shapes in an array or collection and still call draw.
        Shape[] shapes = new Shape[]{circle, rectangle};
        for (Shape shape : shapes) {
            shape.draw();
        }
    }
}

Encapsulation

Bundle data of object into a single unit "class" and restrict access to internal state / data of object

More controlled access to state of object through getters and setters

public class Person {
    // Private instance variables (attributes)
    private String name;
    private int age;

    // Constructor to initialize the person's name and age
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //Public getters and setters ...
}
public class EncapsulationExample {
    public static void main(String[] args) {
        // Create a Person object
        Person person = new Person("Alice", 30);

        // Access and modify the person's data using getters and setters
        System.out.println("Name: " + person.getName()); // Accessing the name
        System.out.println("Age: " + person.getAge());   // Accessing the age

        person.setName("Bob");  // Modifying the name
        person.setAge(25);      // Modifying the age

        System.out.println("Updated Name: " + person.getName()); // Accessing the updated name
        System.out.println("Updated Age: " + person.getAge());   // Accessing the updated age
    }
}

Abstraction

Simplifying complex systems by focusing on what an object does (its behaviors) while hiding how it does it (implementation details).

eg. A Shape interface defines methods like draw() and resize() without specifying how each shape is drawn or resized.

// Abstract class
public abstract class Shape {
    // Concrete method defined in the abstract class
    public void displayInfo() {
        System.out.println("This is a shape.");
    }

    // Just come up with method , dont need to care about implementation cause that is handled by subclasses
    public abstract double area();
}

// Concrete subclass
public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // Implementing the abstract method from the abstract class
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    // New method specific to the Circle class
    public void describe() {
        System.out.println("This is a circle with radius " + radius);
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);

        // Using methods from the abstract class
        circle.displayInfo();  // Output: "This is a shape."
        double circleArea = circle.area();

        // Using the subclass-specific method
        circle.describe();     // Output: "This is a circle with radius 5.0"
    }
}

Last updated