Site icon CloudCusp

Java Week 3: An Ultimate Guide to OOPs

Java Week 3

In this Week We’ll cover topics such as Classes and Objects, methods and functions, recursion, and exception handling. So, let’s dive in! we will explore the  fundamental concepts in Java and provide examples and practice codes to help you understand them better.

On This Page

Contents

Classes and Objects

In Java, a class is a blueprint or template for creating objects. It defines the properties and behavior that an object of that class will have. An object, on the other hand, is an instance of a class. It represents a real-world entity and can have its own unique state and behavior.

Creating a Class in Java

To create a class in Java, you use the class keyword followed by the name of the class. Here’s an example:

public class Car {
    // Class variables
    String brand;
    String color;
    int year;

    // Class method
    public void start() {
        System.out.println("The car is starting...");
    }
}

In the above example, we have defined a class called Car with three instance variables: brandcolor, and year. We also have a class method called start() that prints a message when called.

Creating Objects from a Class

To create objects from a class, you use the new keyword followed by the name of the class and parentheses. Here’s an example:

Car myCar = new Car();
myCar.brand = "Toyota";
myCar.color = "Red";
myCar.year = 2021;

In the above example, we have created an object of the Car class called myCar. We then set the values of its instance variables using dot notation.

Example Codes

Here are five example codes that demonstrate the use of classes and objects in Java:

Example 1: Calculator

public class Calculator {
    int add(int a, int b) {
        return a + b;
    }

    int subtract(int a, int b) {
        return a - b;
    }

    int multiply(int a, int b) {
        return a * b;
    }

    int divide(int a, int b) {
        return a / b;
    }
}

// Usage:
Calculator myCalculator = new Calculator();
int result = myCalculator.add(5, 3);
System.out.println("Result: " + result);

In this example, we have created a Calculator class with methods to perform basic arithmetic operations. We create an object of the class and use its methods to perform calculations.

Example 2: Circle

public class Circle {
    double radius;

    double calculateArea() {
        return Math.PI * radius * radius;
    }

    double calculatePerimeter() {
        return Math.PI * radius * 2;
    }
}

// Usage:
Circle myCircle = new Circle();
myCircle.radius = 5.0;
double area = myCircle.calculateArea();
System.out.println("Area: " + area);

In this example, we have created a Circle class with methods to calculate its area and perimeter. We create an object of the class and set its radius, then use its methods to calculate the area.

Example 3: Student

public class Student {
    String name;
    int age;

    void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

// Usage:
Student myStudent = new Student();
myStudent.name = "John";
myStudent.age = 20;
myStudent.displayInfo();

In this example, we have created a Student class with instance variables for name and age, and a method to display the student’s information. We create an object of the class, set its name and age, and then call the displayInfo() method to print the information.

Example 4: Bank Account

public class BankAccount {
    String accountNumber;
    double balance;

    void deposit(double amount) {
        balance += amount;
    }

    void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("Insufficient funds");
        }
    }

    void displayBalance() {
        System.out.println("Balance: " + balance);
    }
}

// Usage:
BankAccount myAccount = new BankAccount();
myAccount.accountNumber = "123456789";
myAccount.deposit(1000.0);
myAccount.withdraw(500.0);
myAccount.displayBalance();

In this example, we have created a BankAccount class with instance variables for the account number and balance, and methods to deposit, withdraw, and display the balance. We create an object of the class, set its account number, deposit some money, withdraw some money, and then display the balance.

Example 5: Rectangle

public class Rectangle {
    double length;
    double width;

    double calculateArea() {
        return length * width;
    }

    double calculatePerimeter() {
        return 2 * (length + width);
    }
}

// Usage:
Rectangle myRectangle = new Rectangle();
myRectangle.length = 5.0;
myRectangle.width = 3.0;
double area = myRectangle.calculateArea();
System.out.println("Area: " + area);

In this example, we have created a Rectangle class with instance variables for the length and width, and methods to calculate its area and perimeter. We create an object of the class, set its length and width, and then use its methods to calculate the area.

Practice Problems

Here are some practice problems to further enhance your understanding of classes and objects in Java:

  1. Create a class called Person with instance variables for name, age, and address. Add a method to display the person’s information.
  2. Create a class called Book with instance variables for title, author, and publication year. Add a method to display the book’s information.
  3. Create a class called Bank with instance variables for bank name and branch. Add methods to open an account, deposit money, withdraw money, and display account balance.
  4. Create a class called Employee with instance variables for employee name, employee ID, and salary. Add a method to display the employee’s information.
  5. Create a class called Triangle with instance variables for the lengths of its three sides. Add methods to calculate its area and perimeter.

Constructors and Instance Variables in Java

In Java, constructors and instance variables play a crucial role in object-oriented programming. Constructors are special methods that are used to initialize objects, while instance variables are variables that belong to each instance of a class. Lets explore constructors and instance variables in Java with examples to help you understand their usage.

Constructors

A constructor is a special method that is used to create an object of a class. It is called when an object is instantiated using the new keyword. Constructors have the same name as the class and do not have a return type, not even void.

Constructors can be used to initialize the instance variables of a class, perform any necessary setup, and ensure that the object is in a valid state. They can also take parameters to allow customization during object creation.

Here are five examples of constructors in Java:

Example 1: Default Constructor

public class Person {
    private String name;
    private int age;

    // Default constructor
    public Person() {
        name = "John Doe";
        age = 30;
    }
}

In this example, we have a class called Person with two instance variables: name and age. The default constructor initializes these variables with default values.

Example 2: Parameterized Constructor

public class Person {
    private String name;
    private int age;

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

In this example, we have a parameterized constructor that takes two parameters: name and age. The constructor assigns the parameter values to the instance variables.

Example 3: Constructor Overloading

public class Rectangle {
    private int width;
    private int height;

    // Default constructor
    public Rectangle() {
        width = 1;
        height = 1;
    }

    // Parameterized constructor
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    // Constructor with only one parameter
    public Rectangle(int side) {
        this.width = side;
        this.height = side;
    }
}

In this example, we have a class called Rectangle with three constructors. The first constructor is the default constructor, the second constructor is a parameterized constructor that takes the width and height as parameters, and the third constructor is another parameterized constructor that takes only one parameter for creating a square.

Example 4: Chaining Constructors

public class Car {
    private String make;
    private String model;
    private int year;

    // Default constructor
    public Car() {
        this("Unknown", "Unknown", 0);
    }

    // Parameterized constructor
    public Car(String make, String model, int year) {
        this.make = make;
        this.model = model;
        this.year = year;
    }
}

In this example, we have a class called Car with two constructors. The default constructor calls the parameterized constructor using the this keyword to initialize the instance variables.

Example 5: Copy Constructor

public class Book {
    private String title;
    private String author;

    // Parameterized constructor
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // Copy constructor
    public Book(Book other) {
        this.title = other.title;
        this.author = other.author;
    }
}

In this example, we have a class called Book with two constructors. The parameterized constructor initializes the instance variables with the provided values. The copy constructor creates a new object by copying the values from another object of the same class.

Practice Problems

Now that you have learned about constructors in Java, here are some practice problems for you to solve:

  1. Create a class called Student with instance variables for name, age, and grade. Write a parameterized constructor to initialize these variables.
  2. Create a class called BankAccount with instance variables for account number, balance, and account holder name. Write a default constructor to initialize these variables.
  3. Create a class called Employee with instance variables for name, salary, and department. Write a copy constructor to create a new object by copying the values from another object.
  4. Create a class called Circle with instance variables for radius and area. Write a constructor to initialize the radius and calculate the area.
  5. Create a class called Product with instance variables for name, price, and quantity. Write a constructor to initialize these variables and calculate the total cost.

Inheritance and Polymorphism in Java

Inheritance and polymorphism are two fundamental concepts in object-oriented programming (OOP) that allow for code reuse and flexibility. Lets  explore the concepts of inheritance and polymorphism in Java, along with  example codes to illustrate their usage. Additionally, we will provide some practice problems to help you solidify your understanding.

1. Inheritance

Inheritance is a mechanism in Java that allows a class to inherit properties and methods from another class. The class that is being inherited from is called the parent class or superclass, and the class that inherits from it is called the child class or subclass. The child class can access the public and protected members of the parent class.

Here’s an example code that demonstrates inheritance:

class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void makeSound() {
        System.out.println("The dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.makeSound();
    }
}

In this example, the `Animal` class is the parent class, and the `Dog` class is the child class. The `Dog` class inherits the `name` property and the `makeSound()` method from the `Animal` class. When we create a `Dog` object and call the `makeSound()` method, it prints “The dog barks” instead of “The animal makes a sound” because the `makeSound()` method in the `Dog` class overrides the one in the `Animal` class.

2. Polymorphism

Polymorphism is the ability of an object to take on many forms. In Java, polymorphism is achieved through method overriding and method overloading. Method overriding occurs when a child class provides its own implementation of a method that is already defined in the parent class. Method overloading, on the other hand, occurs when multiple methods with the same name but different parameters are defined in a class.

Let’s see an example of polymorphism through method overriding:

class Shape {
    public void draw() {
        System.out.println("Drawing a shape");
    }
}

class Circle extends Shape {
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Rectangle extends Shape {
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Rectangle();

        shape1.draw();
        shape2.draw();
    }
}

In this example, we have a `Shape` class and two subclasses, `Circle` and `Rectangle`. Each subclass overrides the `draw()` method defined in the `Shape` class. When we create a `Circle` object and assign it to a `Shape` reference, and a `Rectangle` object and assign it to another `Shape` reference, we can call the `draw()` method on both objects. The output will be:

Drawing a circle
Drawing a rectangle

Practice Problems

Now that we have covered the basics of inheritance and polymorphism in Java, here are some practice problems for you to try:

  1. Create a class hierarchy for different types of vehicles, such as cars, motorcycles, and bicycles. Implement a method in each class to display the type of vehicle.
  2. Create a class hierarchy for different types of employees, such as managers, developers, and salespeople. Implement a method in each class to calculate the salary based on different parameters.
  3. Create a class hierarchy for different types of shapes, such as squares, triangles, and circles. Implement a method in each class to calculate the area of the shape.
  4. Create a class hierarchy for different types of animals, such as mammals, birds, and reptiles. Implement a method in each class to display the sound the animal makes.
  5. Create a class hierarchy for different types of food, such as fruits, vegetables, and grains. Implement a method in each class to display the nutritional information of the food.

These practice problems will help you further explore the concepts of inheritance and polymorphism in Java and enhance your OOP skills.

Remember, understanding inheritance and polymorphism is crucial for writing clean and efficient code in Java. By leveraging these concepts, you can create reusable and flexible code that can be easily extended and maintained.

Extending Classes in Java

In Java, classes can be extended to create new classes that inherit the properties and behaviors of the parent class. This is achieved through the use of the extends keyword. When a class extends another class, it inherits all the non-private fields and methods of the parent class.

Here’s an example:

public class Animal {
    public void eat() {
        System.out.println("The animal is eating.");
    }
}

public class Dog extends Animal {
    public void bark() {
        System.out.println("The dog is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // Output: The animal is eating.
        dog.bark(); // Output: The dog is barking.
    }
}

In this example, the Dog class extends the Animal class. The Dog class inherits the eat() method from the Animal class and also has its own bark() method.

Method Overriding in Java

Method overriding is a feature in Java that allows a subclass to provide a different implementation of a method that is already defined in its superclass. This is done by using the @Override annotation and providing a new implementation for the method.

Here’s an example:

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // Output: The dog barks.
    }
}

In this example, the Dog class overrides the makeSound() method of the Animal class and provides its own implementation. When the makeSound() method is called on a Dog object, it will print “The dog barks.”

Dynamic Method Dispatch in Java

Dynamic method dispatch is a mechanism in Java that allows a method to be called on an object based on the type of the object at runtime. This is achieved through the use of inheritance and method overriding.

Here’s an example:

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks.");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The cat meows.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        
        animal1.makeSound(); // Output: The dog barks.
        animal2.makeSound(); // Output: The cat meows.
    }
}

In this example, the Animal class has a makeSound() method. The Dog and Cat classes override this method with their own implementations. When the makeSound() method is called on an Animal object, the specific implementation of the method in the subclass is executed based on the type of the object at runtime.

Practice Problems

Here are some practice problems to further enhance your understanding of extending classes, method overriding, and dynamic method dispatch:

  1. Create a class called Shape with a method called calculateArea(). Create two subclasses, Rectangle and Circle, that override the calculateArea() method to calculate the area of a rectangle and circle respectively.
  2. Create a class called Vehicle with a method called startEngine(). Create two subclasses, Car and Motorcycle, that override the startEngine() method to start the engine of a car and motorcycle respectively.
  3. Create a class called Employee with a method called calculateSalary(). Create two subclasses, Manager and Developer, that override the calculateSalary() method to calculate the salary of a manager and developer respectively.

These practice problems will help you solidify your understanding of extending classes, method overriding, and dynamic method dispatch in Java.

Abstraction and Interfaces in Object-Oriented Programming

In the realm of object-oriented programming (OOP), abstraction serves as a vital concept, enabling developers to hide complex internal details of classes while exposing only essential features to external components. This practice facilitates the creation of intricate systems by breaking them down into more manageable components. One of the key mechanisms to achieve abstraction is through interfaces.

Abstract Classes and Methods

Abstract classes in Java are classes that cannot be instantiated directly; rather, they are intended to serve as blueprints for other classes to inherit from. Such classes can contain both abstract and non-abstract methods. Abstract methods are declared without implementation and must be overridden by subclasses.

public abstract class Animal {
    public abstract void sound();

    public void sleep() {
        System.out.println("Zzzzz");
    }
}

In this example, the Animal class is declared as abstract and includes an abstract method sound(), which concrete subclasses must implement. Additionally, it has a non-abstract method sleep(), providing a default implementation. This design enables the creation of a hierarchy of animal types while ensuring each subclass provides its unique sound.

Implementing Interfaces

Interfaces define contracts consisting of a set of methods that implementing classes must adhere to. They facilitate multiple inheritance in Java, allowing a class to implement multiple interfaces. To implement an interface, a class must provide implementations for all declared methods within the interface.

public interface Shape {
    double calculateArea();
    double calculatePerimeter();
}

Any class implementing the Shape interface must offer implementations for calculateArea() and calculatePerimeter() methods. Interfaces provide a powerful way to define common behaviors that various classes can share, regardless of their specific implementation details.

public class Circle implements Shape {
    private double radius;

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

    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}

In this instance, the Circle class implements the Shape interface and provides concrete implementations for calculateArea() and calculatePerimeter() methods. This implementation ensures consistency and allows different shapes to be treated uniformly wherever the Shape interface is used.

Interface Inheritance

Java interfaces can also inherit from other interfaces, allowing the creation of interface hierarchies to define common behavior shared among multiple interfaces.

public interface Vehicle {
    void start();
    void stop();
}
public interface Car extends Vehicle {
    void accelerate();
    void brake();
}

Here, the Car interface extends the Vehicle interface, mandating any class implementing Car to provide implementations for start(), stop(), accelerate(), and brake() methods. Interface inheritance promotes code reusability and maintains a clear, hierarchical structure of behaviors.

Practice Problems

1. Abstract Class with Concrete Subclasses

public abstract class Shape {
    public abstract double calculateArea();
    public abstract double calculatePerimeter();
}

// Concrete Subclasses
public class Rectangle extends Shape {
    // Implement abstract methods
}

public class Triangle extends Shape {
    // Implement abstract methods
}

public class Circle extends Shape {
    // Implement abstract methods
}

These subclasses extend the Shape abstract class, providing specific implementations for calculating area and perimeter based on their geometrical properties.

2. Interface Implementation

public interface Playable {
    void play();
}

// Implementing Classes
public class Guitar implements Playable {
    // Implement play() method
}

public class Piano implements Playable {
    // Implement play() method
}

public class Drums implements Playable {
    // Implement play() method
}

Each implementing class provides its unique implementation of the play() method, reflecting the distinct nature of musical instruments.

3. Interface with Abstract Methods

public interface Animal {
    void eat();
    void sleep();
}

// Implementing Classes
public class Dog implements Animal {
    // Implement eat() and sleep() methods
}

public class Cat implements Animal {
    // Implement eat() and sleep() methods
}

public class Bird implements Animal {
    // Implement eat() and sleep() methods
}

These classes implement the Animal interface, providing specific behaviors related to eating and sleeping for each animal type.

4. Abstract Class with Concrete Subclasses

public abstract class Vehicle {
    public void start() {
        // Default implementation
    }
    
    public abstract void stop();
}

// Concrete Subclasses
public class Car extends Vehicle {
    // Implement stop() method
}

public class Motorcycle extends Vehicle {
    // Implement stop() method
}

public class Truck extends Vehicle {
    // Implement stop() method
}

These subclasses inherit common behavior from the Vehicle abstract class while providing specific implementations for stopping.

5. Interface with Default Method

public interface Logger {
    default void log(String message) {
        // Default logging implementation
    }
}

// Implementing Classes
public class ConsoleLogger implements Logger {
    // Implement log() method if necessary
}

public class FileLogger implements Logger {
    // Implement log() method if necessary
}

These classes utilize the default log() method from the Logger interface, promoting code reuse while allowing flexibility for customized logging behavior.

By understanding abstraction and interfaces, developers can effectively structure their code, promoting modularity, flexibility, and maintainability in their software projects. These principles facilitate the creation of scalable and robust systems, enabling smoother development and maintenance processes.

And Finally 😄!!

Why did the programmer go broke?

Because he spent all his inheritance on polymorphic objects that extended classes to override methods, but he didn’t have a dynamic method dispatch to manage his finances!

And Don’t Forget to attempt this Quiz once.

FAQs

What is a class in Java?

A class in Java is a blueprint for creating objects. It defines the properties and behaviors that objects of the class will possess.

What is an object in Java?

An object in Java is an instance of a class. It represents a real-world entity and encapsulates data and methods to operate on that data.

How do you define a class in Java?

To define a class in Java, you use the class keyword followed by the class name and its body, which contains fields, methods, constructors, etc.

Explain constructors and instance variables in Java.

Constructors are special methods used to initialize objects. Instance variables are variables declared within a class but outside of any method, constructor, or block, and each object of the class has its own copy of these variables.

What is inheritance in Java?

Inheritance is a mechanism in Java where a new class inherits properties and behaviors (methods) from an existing class. The new class is called a subclass or derived class, and the existing class is called a superclass or base class.

How do you extend classes in Java?

In Java, you extend a class using the extends keyword followed by the superclass name in the declaration of the subclass.

What is polymorphism in Java?

Polymorphism in Java allows objects of different classes to be treated as objects of a common superclass. It enables methods to be overridden in subclasses with different implementations.

What is method overriding?

Method overriding is the ability of a subclass to provide a specific implementation of a method that is already provided by its superclass. The method signature in the subclass must match the method signature in the superclass.

Explain dynamic method dispatch in Java.

Dynamic method dispatch is a mechanism in Java where the method to be invoked is determined at runtime based on the object being referenced, rather than at compile-time based on the reference type.

What is abstraction in Java?

Abstraction in Java is the process of hiding the implementation details and showing only the essential features of an object. It is achieved through abstract classes and interfaces.

What are abstract classes and methods?

Abstract classes are classes that cannot be instantiated and may contain abstract methods, which are declared without an implementation. Subclasses of abstract classes must provide implementations for all abstract methods.

How do you implement interfaces in Java?

In Java, you implement an interface using the implements keyword followed by the interface name in the class declaration. The class must provide implementations for all methods declared in the interface.

Explain interface inheritance in Java.

Interface inheritance in Java allows an interface to inherit methods from another interface. A class implementing the derived interface must provide implementations for all methods from both interfaces.

Exit mobile version