Question 1: Employee-Department System (Association)
Develop an Employee-Department System where an Employee is associated with a Department, but
they exist independently. The Department class should represent a company department with
attributes departmentId and departmentName, both of type String. The class should include a
parameterized constructor to initialize these attributes and a method displayDepartmentDetails() to
print the department information. The Employee class should model an employee with attributes
employeeId, employeeName, and department (of type Department). It should have a default
constructor, a parameterized constructor to initialize employee details, a method
setDepartment(Department dept) to associate the employee with a department, and a
displayEmployeeDetails() method to print employee information along with department details. In
the main method, create a Department object and two Employee objects. Associate both employees
with the department and display the details of all employees.
public class Department {
private String departmentId;
private String departmentName;
// Parameterized constructor
public Department(String departmentId, String departmentName) {
this.departmentId = departmentId;
this.departmentName = departmentName;
// Method to display department details
public void displayDepartmentDetails() {
System.out.println("Department ID: " + departmentId);
System.out.println("Department Name: " + departmentName);
// Employee.java
public class Employee {
private String employeeId;
private String employeeName;
private Department department; // Association
// Default constructor
public Employee() {
// Parameterized constructor
public Employee(String employeeId, String employeeName) {
this.employeeId = employeeId;
this.employeeName = employeeName;
// Method to set department
public void setDepartment(Department department) {
this.department = department;
// Method to display employee details
public void displayEmployeeDetails() {
System.out.println("\n----- EMPLOYEE DETAILS -----");
System.out.println("Employee ID: " + employeeId);
System.out.println("Employee Name: " + employeeName);
if (department != null) {
System.out.println("\nDepartment Information:");
department.displayDepartmentDetails();
} else {
System.out.println("Not assigned to any department.");
// EmployeeDepartmentApp.java
public class EmployeeDepartmentApp {
public static void main(String[] args) {
// Create a Department object
Department itDepartment = new Department("D001", "Information Technology");
// Create Employee objects
Employee emp1 = new Employee("E001", "John Smith");
Employee emp2 = new Employee("E002", "Sarah Johnson");
// Associate employees with department
emp1.setDepartment(itDepartment);
emp2.setDepartment(itDepartment);
// Display employee details
emp1.displayEmployeeDetails();
emp2.displayEmployeeDetails();
}
Question 2: University-Professor System (Aggregation)
Develop a University-Professor System where a University contains multiple Professors, but
Professors can exist independently. The Professor class should represent a university professor with
attributes professorId and professorName, both of type String. The class should include a
parameterized constructor to initialize these attributes and a method displayProfessorDetails() to
print professor information. The University class should model a university that can contain up to
five professors. It should include attributes universityName (String) and an array of Professor objects
(size 5), along with an integer to track the number of professors. The class should provide a
constructor to set the university name, a method addProfessor(Professor prof) to add a professor to
the array, and a displayUniversityDetails() method to print university information and all professors'
details. In the main method, create a University object and three Professor objects, add the
professors to the university, and display the university details.
// Professor.java
public class Professor {
private String professorId;
private String professorName;
// Parameterized constructor
public Professor(String professorId, String professorName) {
this.professorId = professorId;
this.professorName = professorName;
// Method to display professor details
public void displayProfessorDetails() {
System.out.println("Professor ID: " + professorId);
System.out.println("Professor Name: " + professorName);
// University.java
public class University {
private String universityName;
private Professor[] professors = new Professor[5]; // Aggregation
private int professorCount = 0;
// Constructor to set university name
public University(String universityName) {
this.universityName = universityName;
// Method to add professor to the university
public void addProfessor(Professor prof) {
if (professorCount < professors.length) {
professors[professorCount] = prof;
professorCount++;
System.out.println("Professor added to university successfully.");
} else {
System.out.println("Cannot add more professors. Maximum limit reached.");
// Method to display university details
public void displayUniversityDetails() {
System.out.println("\n----- UNIVERSITY DETAILS -----");
System.out.println("University Name: " + universityName);
System.out.println("Number of Professors: " + professorCount);
if (professorCount > 0) {
System.out.println("\n----- PROFESSORS -----");
for (int i = 0; i < professorCount; i++) {
System.out.println("\nProfessor " + (i+1) + ":");
professors[i].displayProfessorDetails();
} else {
System.out.println("No professors at this university yet.");
// UniversityProfessorApp.java
public class UniversityProfessorApp {
public static void main(String[] args) {
// Create University object
University harvard = new University("Harvard University");
// Create Professor objects
Professor prof1 = new Professor("P001", "Dr. Robert Williams");
Professor prof2 = new Professor("P002", "Dr. Jennifer Parker");
Professor prof3 = new Professor("P003", "Dr. Michael Chen");
// Add professors to university
harvard.addProfessor(prof1);
harvard.addProfessor(prof2);
harvard.addProfessor(prof3);
// Display university details
harvard.displayUniversityDetails();
Question 3: Car-Engine System (Composition)
Develop a Car-Engine System that demonstrates composition, where a Car contains an Engine that
cannot exist without the Car. The Engine class should represent a car engine with attributes
engineType and horsepower (int). It should include a parameterized constructor to initialize these
attributes and a method displayEngineDetails() to print engine information. The Car class should
model a car that must have an engine. It should include attributes carModel (String) and engine
(Engine). The class should have a constructor that creates a new Engine as part of its initialization,
making the Engine's lifecycle dependent on the Car. It should also include a displayCarDetails()
method to print car information and engine details. In the main method, create two Car objects with
different engine types and display their details.
// Engine.java
public class Engine {
private String engineType;
private int horsepower;
// Parameterized constructor
public Engine(String engineType, int horsepower) {
this.engineType = engineType;
this.horsepower = horsepower;
// Method to display engine details
public void displayEngineDetails() {
System.out.println("Engine Type: " + engineType);
System.out.println("Horsepower: " + horsepower + " HP");
}
}
// Car.java
public class Car {
private String carModel;
private Engine engine; // Composition
// Constructor that creates a new Engine (composition)
public Car(String carModel, String engineType, int horsepower) {
this.carModel = carModel;
this.engine = new Engine(engineType, horsepower); // Engine lifecycle tied to Car
// Method to display car details
public void displayCarDetails() {
System.out.println("\n----- CAR DETAILS -----");
System.out.println("Car Model: " + carModel);
System.out.println("\nEngine Information:");
engine.displayEngineDetails();
// CarEngineApp.java
public class CarEngineApp {
public static void main(String[] args) {
// Create Car objects with engines
Car car1 = new Car("Toyota Camry", "V6", 268);
Car car2 = new Car("Tesla Model 3", "Electric", 283);
// Display car details
car1.displayCarDetails();
car2.displayCarDetails();
Question 4: Bank-Account System (Inheritance)
Develop a Bank-Account System that demonstrates inheritance, where different types of accounts
inherit from a base Account class. The Account class should be the parent class with attributes
accountNumber (String) and balance (double). It should include a constructor to initialize these
attributes, methods deposit(double amount) and withdraw(double amount) to modify the balance,
and a displayAccountDetails() method. The SavingsAccount class should extend Account and add an
attribute interestRate (double). It should override the displayAccountDetails() method to include
interest rate information and add a calculateInterest() method. The CheckingAccount class should
also extend Account and add an attribute overdraftLimit (double). It should override the withdraw()
method to allow withdrawals up to the overdraft limit and override the displayAccountDetails()
method. In the main method, create objects of both account types, perform transactions, and
display their details.
// Account.java
public class Account {
protected String accountNumber;
protected double balance;
// Constructor
public Account(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
// Method to deposit money
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("$" + amount + " deposited successfully.");
} else {
System.out.println("Invalid deposit amount.");
// Method to withdraw money
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("$" + amount + " withdrawn successfully.");
} else {
System.out.println("Insufficient funds or invalid amount.");
// Method to display account details
public void displayAccountDetails() {
System.out.println("\n----- ACCOUNT DETAILS -----");
System.out.println("Account Number: " + accountNumber);
System.out.println("Balance: $" + balance);
}
// SavingsAccount.java
public class SavingsAccount extends Account {
private double interestRate;
// Constructor
public SavingsAccount(String accountNumber, double initialBalance, double interestRate) {
super(accountNumber, initialBalance); // Call parent constructor
this.interestRate = interestRate;
// Method to calculate interest
public double calculateInterest() {
double interest = balance * interestRate / 100;
System.out.println("Interest calculated: $" + interest);
return interest;
// Apply interest to balance
public void applyInterest() {
double interest = calculateInterest();
deposit(interest);
// Override display method to include interest rate
@Override
public void displayAccountDetails() {
super.displayAccountDetails(); // Call parent method
System.out.println("Account Type: Savings Account");
System.out.println("Interest Rate: " + interestRate + "%");
// CheckingAccount.java
public class CheckingAccount extends Account {
private double overdraftLimit;
// Constructor
public CheckingAccount(String accountNumber, double initialBalance, double overdraftLimit) {
super(accountNumber, initialBalance); // Call parent constructor
this.overdraftLimit = overdraftLimit;
// Override withdraw method to allow overdraft
@Override
public void withdraw(double amount) {
if (amount > 0 && amount <= (balance + overdraftLimit)) {
balance -= amount;
System.out.println("$" + amount + " withdrawn successfully.");
if (balance < 0) {
System.out.println("Account overdrawn! Current balance: $" + balance);
} else {
System.out.println("Withdrawal amount exceeds overdraft limit or is invalid.");
}
}
// Override display method to include overdraft limit
@Override
public void displayAccountDetails() {
super.displayAccountDetails(); // Call parent method
System.out.println("Account Type: Checking Account");
System.out.println("Overdraft Limit: $" + overdraftLimit);
// BankAccountApp.java
public class BankAccountApp {
public static void main(String[] args) {
// Create a SavingsAccount
SavingsAccount savings = new SavingsAccount("SA001", 1000.0, 2.5);
// Create a CheckingAccount
CheckingAccount checking = new CheckingAccount("CA001", 500.0, 200.0);
// Perform transactions
System.out.println("\n----- SAVINGS ACCOUNT TRANSACTIONS -----");
savings.deposit(500.0);
savings.withdraw(200.0);
savings.applyInterest();
System.out.println("\n----- CHECKING ACCOUNT TRANSACTIONS -----");
checking.deposit(300.0);
checking.withdraw(900.0); // This will use the overdraft
// Display account details
savings.displayAccountDetails();
checking.displayAccountDetails();
Question 5: OrderSystem (Dependency)
Develop an Order System where an OrderProcessor class processes an Order object temporarily
without storing a reference to it. The Order class should represent a customer order with attributes
orderId (String), customerName (String), and totalAmount (double). It should include a
parameterized constructor to initialize these attributes and a method displayOrderDetails() to print
order information. The OrderProcessor class should model a processor that handles orders. It should
not store any reference to the Order object. Instead, it should contain methods processOrder(Order
order) that validates the order and calculates taxes, and generateInvoice(Order order) that creates
an invoice for the order. These methods should demonstrate a dependency relationship by using the
Order only during method execution. In the main method, create an Order object and use an
OrderProcessor to process it and generate an invoice.
public class Order {
private String orderId;
private String customerName;
private double totalAmount;
// Parameterized constructor
public Order(String orderId, String customerName, double totalAmount) {
this.orderId = orderId;
this.customerName = customerName;
this.totalAmount = totalAmount;
}
// Getters
public String getOrderId() {
return orderId;
public String getCustomerName() {
return customerName;
public double getTotalAmount() {
return totalAmount;
// Method to display order details
public void displayOrderDetails() {
System.out.println("Order ID: " + orderId);
System.out.println("Customer Name: " + customerName);
System.out.println("Total Amount: $" + totalAmount);
// OrderProcessor.java
public class OrderProcessor {
// Process an order (dependency - uses Order temporarily)
public void processOrder(Order order) {
System.out.println("\n----- PROCESSING ORDER -----");
System.out.println("Validating order: " + order.getOrderId());
if (order.getTotalAmount() <= 0) {
System.out.println("Invalid order amount!");
return;
double tax = calculateTax(order.getTotalAmount());
System.out.println("Order validated successfully.");
System.out.println("Tax calculated: $" + tax);
System.out.println("Total with tax: $" + (order.getTotalAmount() + tax));
// Generate invoice for an order (dependency - uses Order temporarily)
public void generateInvoice(Order order) {
System.out.println("\n----- INVOICE -----");
System.out.println("Invoice for Order: " + order.getOrderId());
System.out.println("Customer: " + order.getCustomerName());
double subtotal = order.getTotalAmount();
double tax = calculateTax(subtotal);
double total = subtotal + tax;
System.out.println("Subtotal: $" + subtotal);
System.out.println("Tax (8%): $" + tax);
System.out.println("Total: $" + total);
System.out.println("Thank you for your business!");
}
// Helper method to calculate tax
private double calculateTax(double amount) {
return amount * 0.08; // 8% tax rate
// OrderSystemApp.java
public class OrderSystemApp {
public static void main(String[] args) {
// Create Order object
Order order = new Order("ORD1001", "John Doe", 150.75);
// Create OrderProcessor
OrderProcessor processor = new OrderProcessor();
// Display order details
System.out.println("----- ORDER DETAILS -----");
order.displayOrderDetails();
// Process the order
processor.processOrder(order);
// Generate invoice
processor.generateInvoice(order);
}
Summary of Object-Oriented Relationships in the Questions
Each question demonstrates a different type of relationship in object-oriented programming:
1. Question 1: Employee-Department System (Association)
o Shows association where Employee and Department are connected but exist
independently
o Employee has a reference to Department but Department doesn't track Employees
o Neither class controls the lifecycle of the other
2. Question 2: University-Professor System (Aggregation)
o Shows aggregation where University contains Professors
o University has references to Professor objects
o Professors can exist independently of the University
o A "has-a" relationship with independent parts
3. Question 3: Car-Engine System (Composition)
o Shows composition where Car contains an Engine
o Engine is created when Car is created
o Engine's lifecycle is dependent on Car's lifecycle
o A "part-of" relationship with strong ownership
4. Question 4: Bank-Account System (Inheritance)
o Shows inheritance where SavingsAccount and CheckingAccount inherit from
Account
o Demonstrates "is-a" relationship
o Child classes extend and specialize behavior of the parent class
o Demonstrates method overriding
5. Question 5: OrderSystem (Dependency)
o Shows dependency where OrderProcessor temporarily uses Order objects
o OrderProcessor doesn't store Order references as attributes
o Methods use Order objects only during execution
o A "uses-a" temporary relationship
5 Additional Object-Oriented Programming Relationship Questions
I'll create 5 more questions that demonstrate the different relationships in object-oriented
programming, following the same format as before.
Question 6: Hotel-Guest System (Association)
Develop a Hotel-Guest System where a Guest is associated with a Hotel during their stay, but they
exist independently. The Hotel class should have attributes hotelId and hotelName, both of type
String. It should include a parameterized constructor to initialize these attributes and a method
displayHotelDetails() to print hotel information. The Guest class should model a guest with attributes
guestId, guestName, and currentHotel (of type Hotel). It should include a default constructor, a
parameterized constructor for guest details, a method checkIn(Hotel hotel) to associate with a hotel,
checkOut() to end the association, and displayGuestDetails() to print guest information and current
hotel (if any). In the main method, create a Hotel object and two Guest objects, check them in to the
hotel, display details, then check one guest out and display the updated information.
public class Hotel {
private String hotelId;
private String hotelName;
// Parameterized constructor
public Hotel(String hotelId, String hotelName) {
this.hotelId = hotelId;
this.hotelName = hotelName;
// Method to display hotel details
public void displayHotelDetails() {
System.out.println("Hotel ID: " + hotelId);
System.out.println("Hotel Name: " + hotelName);
// Guest.java
public class Guest {
private String guestId;
private String guestName;
private Hotel currentHotel; // Association
// Default constructor
public Guest() {
// Parameterized constructor
public Guest(String guestId, String guestName) {
this.guestId = guestId;
this.guestName = guestName;
// Method to check in to a hotel
public void checkIn(Hotel hotel) {
this.currentHotel = hotel;
System.out.println(guestName + " checked in to " + hotel.getClass().getName());
// Method to check out from hotel
public void checkOut() {
if (currentHotel != null) {
System.out.println(guestName + " checked out from hotel");
this.currentHotel = null;
} else {
System.out.println(guestName + " is not currently staying at any hotel");
// Method to display guest details
public void displayGuestDetails() {
System.out.println("\n----- GUEST DETAILS -----");
System.out.println("Guest ID: " + guestId);
System.out.println("Guest Name: " + guestName);
if (currentHotel != null) {
System.out.println("\nCurrently staying at:");
currentHotel.displayHotelDetails();
} else {
System.out.println("Not currently staying at any hotel");
// HotelGuestApp.java
public class HotelGuestApp {
public static void main(String[] args) {
// Create a Hotel object
Hotel grandHotel = new Hotel("H001", "Grand Hotel");
// Create Guest objects
Guest guest1 = new Guest("G001", "Alex Johnson");
Guest guest2 = new Guest("G002", "Maria Garcia");
// Check in guests to hotel
guest1.checkIn(grandHotel);
guest2.checkIn(grandHotel);
// Display guest details
System.out.println("\n----- AFTER CHECK-IN -----");
guest1.displayGuestDetails();
guest2.displayGuestDetails();
// Check out one guest
guest1.checkOut();
// Display updated details
System.out.println("\n----- AFTER CHECK-OUT -----");
guest1.displayGuestDetails();
guest2.displayGuestDetails();
}
Question 7: Store-Product System (Aggregation)
Develop a Store-Product System where a Store contains multiple Products, but Products can exist
independently and can be transferred between Stores. The Product class should have attributes
productId, productName, and price (double). It should include a parameterized constructor to
initialize these attributes and a method displayProductDetails() to print product information. The
Store class should model a store that can contain up to ten products. It should include attributes
storeId, storeName, and an array of Product objects (size 10), along with a count of current
products. It should provide methods addProduct(Product product) to add a product to the array,
removeProduct(String productId) to remove a product from the store, and displayStoreDetails() to
print store information and all products. In the main method, create two Store objects and three
Product objects, add products to the first store, display details, then transfer a product to the second
store and display updated information for both stores.
// Product.java
public class Product {
private String productId;
private String productName;
private double price;
// Parameterized constructor
public Product(String productId, String productName, double price) {
this.productId = productId;
this.productName = productName;
this.price = price;
// Getter for productId
public String getProductId() {
return productId;
// Method to display product details
public void displayProductDetails() {
System.out.println("Product ID: " + productId);
System.out.println("Product Name: " + productName);
System.out.println("Price: $" + price);
// Store.java
public class Store {
private String storeId;
private String storeName;
private Product[] products = new Product[10]; // Aggregation
private int productCount = 0;
// Parameterized constructor
public Store(String storeId, String storeName) {
this.storeId = storeId;
this.storeName = storeName;
// Method to add product to store
public void addProduct(Product product) {
if (productCount < products.length) {
products[productCount] = product;
productCount++;
System.out.println("Product " + product.getProductId() + " added to store " + storeName);
} else {
System.out.println("Cannot add more products. Store inventory full.");
// Method to remove product from store
public Product removeProduct(String productId) {
Product removedProduct = null;
int index = -1;
// Find the product
for (int i = 0; i < productCount; i++) {
if (products[i].getProductId().equals(productId)) {
index = i;
removedProduct = products[i];
break;
// Remove the product if found
if (index != -1) {
// Shift products to fill the gap
for (int i = index; i < productCount - 1; i++) {
products[i] = products[i + 1];
products[productCount - 1] = null;
productCount--;
System.out.println("Product " + productId + " removed from store " + storeName);
} else {
System.out.println("Product " + productId + " not found in store " + storeName);
return removedProduct;
// Method to display store details
public void displayStoreDetails() {
System.out.println("\n----- STORE DETAILS -----");
System.out.println("Store ID: " + storeId);
System.out.println("Store Name: " + storeName);
System.out.println("Product Count: " + productCount);
if (productCount > 0) {
System.out.println("\n----- STORE INVENTORY -----");
for (int i = 0; i < productCount; i++) {
System.out.println("\nProduct " + (i+1) + ":");
products[i].displayProductDetails();
} else {
System.out.println("No products in store inventory.");
// StoreProductApp.java
public class StoreProductApp {
public static void main(String[] args) {
// Create Store objects
Store store1 = new Store("S001", "Main Street Store");
Store store2 = new Store("S002", "Downtown Branch");
// Create Product objects
Product product1 = new Product("P001", "Laptop", 899.99);
Product product2 = new Product("P002", "Smartphone", 499.99);
Product product3 = new Product("P003", "Headphones", 79.99);
// Add products to store1
store1.addProduct(product1);
store1.addProduct(product2);
store1.addProduct(product3);
// Display initial store details
System.out.println("\n----- INITIAL STORE DETAILS -----");
store1.displayStoreDetails();
store2.displayStoreDetails();
// Transfer product2 from store1 to store2
System.out.println("\n----- TRANSFERRING PRODUCT -----");
Product transferredProduct = store1.removeProduct("P002");
if (transferredProduct != null) {
store2.addProduct(transferredProduct);
}
// Display updated store details
System.out.println("\n----- UPDATED STORE DETAILS -----");
store1.displayStoreDetails();
store2.displayStoreDetails();
Question 8: Computer-Motherboard System (Composition)
Develop a Computer-Motherboard System that demonstrates composition, where a Computer
contains a Motherboard that cannot exist without the Computer. The Motherboard class should
represent a computer motherboard with attributes model, chipset, and socketType, all of type
String. It should include a parameterized constructor to initialize these attributes and a method
displayMotherboardDetails() to print motherboard information. The Computer class should model a
computer that must have a motherboard. It should include attributes computerName (String),
manufacturer (String), and motherboard (Motherboard). The class should have a constructor that
creates a new Motherboard as part of its initialization, making the Motherboard's lifecycle
dependent on the Computer. It should also include a displayComputerDetails() method to print
computer information and motherboard details. In the main method, create two Computer objects
with different motherboard specifications and display their details.
// Motherboard.java
public class Motherboard {
private String model;
private String chipset;
private String socketType;
// Parameterized constructor
public Motherboard(String model, String chipset, String socketType) {
this.model = model;
this.chipset = chipset;
this.socketType = socketType;
}
// Method to display motherboard details
public void displayMotherboardDetails() {
System.out.println("Motherboard Model: " + model);
System.out.println("Chipset: " + chipset);
System.out.println("Socket Type: " + socketType);
// Computer.java
public class Computer {
private String computerName;
private String manufacturer;
private Motherboard motherboard; // Composition
// Constructor that creates a new Motherboard (composition)
public Computer(String computerName, String manufacturer, String motherboardModel,
String chipset, String socketType) {
this.computerName = computerName;
this.manufacturer = manufacturer;
// Create the motherboard as part of the computer - lifecycle dependency
this.motherboard = new Motherboard(motherboardModel, chipset, socketType);
// Method to display computer details
public void displayComputerDetails() {
System.out.println("\n----- COMPUTER DETAILS -----");
System.out.println("Computer Name: " + computerName);
System.out.println("Manufacturer: " + manufacturer);
System.out.println("\nMotherboard Information:");
motherboard.displayMotherboardDetails();
// ComputerMotherboardApp.java
public class ComputerMotherboardApp {
public static void main(String[] args) {
// Create Computer objects with motherboards
Computer computer1 = new Computer("WorkStation Pro", "Dell",
"Z590", "Intel Z590", "LGA1200");
Computer computer2 = new Computer("GamingRig X1", "Custom Build",
"ROG Maximus", "AMD X570", "AM4");
// Display computer details
computer1.displayComputerDetails();
computer2.displayComputerDetails();
}
Question 9: Shape Hierarchy System (Inheritance)
Develop a Shape Hierarchy System that demonstrates inheritance, where different types of shapes
inherit from a base Shape class. The Shape class should be the parent class with attributes color
(String) and filled (boolean). It should include a constructor to initialize these attributes, getArea()
and getPerimeter() methods that return 0.0 by default, and a displayDetails() method. The Circle
class should extend Shape and add a radius (double) attribute. It should override getArea() and
getPerimeter() to calculate using the radius, and override displayDetails() to include circle-specific
information. The Rectangle class should also extend Shape and add width (double) and height
(double) attributes. It should override getArea(), getPerimeter(), and displayDetails() methods for
rectangle calculations. In the main method, create objects of both shape types, set their properties,
and display their details including area and perimeter.
// Shape.java
public class Shape {
protected String color;
protected boolean filled;
// Constructor
public Shape(String color, boolean filled) {
this.color = color;
this.filled = filled;
// Method to calculate area (default implementation)
public double getArea() {
return 0.0; // Default implementation
// Method to calculate perimeter (default implementation)
public double getPerimeter() {
return 0.0; // Default implementation
}
// Method to display shape details
public void displayDetails() {
System.out.println("Color: " + color);
System.out.println("Filled: " + (filled ? "Yes" : "No"));
// Circle.java
public class Circle extends Shape {
private double radius;
// Constructor
public Circle(String color, boolean filled, double radius) {
super(color, filled); // Call parent constructor
this.radius = radius;
// Override getArea for circle
@Override
public double getArea() {
return Math.PI * radius * radius;
// Override getPerimeter for circle
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
// Override displayDetails to include circle information
@Override
public void displayDetails() {
System.out.println("\n----- CIRCLE DETAILS -----");
super.displayDetails(); // Call parent method
System.out.println("Radius: " + radius);
System.out.println("Area: " + String.format("%.2f", getArea()));
System.out.println("Perimeter: " + String.format("%.2f", getPerimeter()));
// Rectangle.java
public class Rectangle extends Shape {
private double width;
private double height;
// Constructor
public Rectangle(String color, boolean filled, double width, double height) {
super(color, filled); // Call parent constructor
this.width = width;
this.height = height;
// Override getArea for rectangle
@Override
public double getArea() {
return width * height;
// Override getPerimeter for rectangle
@Override
public double getPerimeter() {
return 2 * (width + height);
// Override displayDetails to include rectangle information
@Override
public void displayDetails() {
System.out.println("\n----- RECTANGLE DETAILS -----");
super.displayDetails(); // Call parent method
System.out.println("Width: " + width);
System.out.println("Height: " + height);
System.out.println("Area: " + String.format("%.2f", getArea()));
System.out.println("Perimeter: " + String.format("%.2f", getPerimeter()));
// ShapeApp.java
public class ShapeApp {
public static void main(String[] args) {
// Create a Circle
Circle circle = new Circle("Red", true, 5.0);
// Create a Rectangle
Rectangle rectangle = new Rectangle("Blue", false, 4.0, 6.0);
// Display shape details
circle.displayDetails();
rectangle.displayDetails();
// Demonstrate polymorphism
System.out.println("\n----- DEMONSTRATING POLYMORPHISM -----");
Shape shape1 = new Circle("Green", true, 3.0);
Shape shape2 = new Rectangle("Yellow", true, 2.0, 8.0);
shape1.displayDetails();
shape2.displayDetails();
}
Question 10: Calculator-Validator System (Dependency)
Develop a Calculator-Validator System where a Calculator class uses a NumberValidator object
temporarily to validate inputs before performing calculations. The NumberValidator class should be
responsible for validating numeric inputs with methods isPositive(double num), isNegative(double
num), and isInRange(double num, double min, double max). The Calculator class should perform
mathematical operations but depend on the NumberValidator to check inputs first. It should include
methods add(double a, double b), subtract(double a, double b), multiply(double a, double b), and
divide(double a, double b), each of which creates a temporary NumberValidator to validate inputs
before performing calculations. These methods should demonstrate a dependency relationship by
using the NumberValidator only during method execution. In the main method, create a Calculator
object and use it to perform various operations with both valid and invalid inputs.
// NumberValidator.java
public class NumberValidator {
// Check if number is positive
public boolean isPositive(double num) {
return num > 0;
// Check if number is negative
public boolean isNegative(double num) {
return num < 0;
// Check if number is in range [min, max]
public boolean isInRange(double num, double min, double max) {
return num >= min && num <= max;
// Check if number is not zero (for division)
public boolean isNotZero(double num) {
return num != 0;
}
// Calculator.java
public class Calculator {
// Add two numbers
public double add(double a, double b) {
// Create temporary validator (dependency)
NumberValidator validator = new NumberValidator();
// For demonstration purposes, we'll validate that inputs are in a reasonable range
if (!validator.isInRange(a, -1000, 1000) || !validator.isInRange(b, -1000, 1000)) {
System.out.println("Warning: Numbers are outside the recommended range!");
return a + b;
// Subtract b from a
public double subtract(double a, double b) {
// Create temporary validator (dependency)
NumberValidator validator = new NumberValidator();
// For demonstration purposes, we'll validate that inputs are in a reasonable range
if (!validator.isInRange(a, -1000, 1000) || !validator.isInRange(b, -1000, 1000)) {
System.out.println("Warning: Numbers are outside the recommended range!");
}
return a - b;
// Multiply two numbers
public double multiply(double a, double b) {
// Create temporary validator (dependency)
NumberValidator validator = new NumberValidator();
// For demonstration purposes, we'll validate that inputs are in a reasonable range
if (!validator.isInRange(a, -1000, 1000) || !validator.isInRange(b, -1000, 1000)) {
System.out.println("Warning: Numbers are outside the recommended range!");
return a * b;
// Divide a by b
public double divide(double a, double b) {
// Create temporary validator (dependency)
NumberValidator validator = new NumberValidator();
// Validate divisor is not zero
if (!validator.isNotZero(b)) {
throw new ArithmeticException("Cannot divide by zero!");
}
// For demonstration purposes, we'll validate that inputs are in a reasonable range
if (!validator.isInRange(a, -1000, 1000) || !validator.isInRange(b, -1000, 1000)) {
System.out.println("Warning: Numbers are outside the recommended range!");
return a / b;
// Square root with validation
public double squareRoot(double a) {
// Create temporary validator (dependency)
NumberValidator validator = new NumberValidator();
// Validate number is positive
if (!validator.isPositive(a)) {
throw new IllegalArgumentException("Cannot take square root of negative number!");
return Math.sqrt(a);
// CalculatorApp.java
public class CalculatorApp {
public static void main(String[] args) {
// Create Calculator object
Calculator calculator = new Calculator();
System.out.println("----- CALCULATOR OPERATIONS -----");
// Addition
try {
double result = calculator.add(10.5, 5.5);
System.out.println("10.5 + 5.5 = " + result);
// Large numbers
result = calculator.add(2000, 3000);
System.out.println("2000 + 3000 = " + result);
} catch (Exception e) {
System.out.println("Addition error: " + e.getMessage());
// Subtraction
try {
double result = calculator.subtract(20.0, 7.5);
System.out.println("20.0 - 7.5 = " + result);
} catch (Exception e) {
System.out.println("Subtraction error: " + e.getMessage());
// Multiplication
try {
double result = calculator.multiply(4.0, 5.0);
System.out.println("4.0 * 5.0 = " + result);
} catch (Exception e) {
System.out.println("Multiplication error: " + e.getMessage());
// Division (valid)
try {
double result = calculator.divide(10.0, 2.0);
System.out.println("10.0 / 2.0 = " + result);
} catch (Exception e) {
System.out.println("Division error: " + e.getMessage());
// Division by zero (invalid)
try {
double result = calculator.divide(10.0, 0.0);
System.out.println("10.0 / 0.0 = " + result);
} catch (Exception e) {
System.out.println("Division error: " + e.getMessage());
// Square root (valid)
try {
double result = calculator.squareRoot(16.0);
System.out.println("√16.0 = " + result);
} catch (Exception e) {
System.out.println("Square root error: " + e.getMessage());
}
// Square root of negative number (invalid)
try {
double result = calculator.squareRoot(-4.0);
System.out.println("√-4.0 = " + result);
} catch (Exception e) {
System.out.println("Square root error: " + e.getMessage());
Summary of Object-Oriented Relationships in the Additional Questions
These 5 new questions demonstrate different types of relationships in object-oriented
programming:
1. Question 6: Hotel-Guest System (Association)
o Shows association where Guest can be associated with a Hotel temporarily
o Guest has a reference to Hotel but can check in and check out
o Neither class controls the lifecycle of the other
o Demonstrates temporary and optional association
2. Question 7: Store-Product System (Aggregation)
o Shows aggregation where Store contains Products
o Store has references to Product objects in an array
o Products can exist independently and can be transferred between stores
o A "has-a" relationship with independent parts that can be shared
3. Question 8: Computer-Motherboard System (Composition)
o Shows composition where Computer contains a Motherboard
o Motherboard is created when Computer is created
o Motherboard's lifecycle is tied to the Computer's lifecycle
o A strong "part-of" relationship with complete ownership
4. Question 9: Shape Hierarchy System (Inheritance)
o Shows inheritance where Circle and Rectangle inherit from Shape
o Demonstrates "is-a" relationship with method overriding
o Child classes extend and specialize behavior of the parent class
o Shows polymorphism through the parent class reference
5. Question 10: Calculator-Validator System (Dependency)
o Shows dependency where Calculator temporarily uses NumberValidator
o Calculator creates validator objects locally within methods
o Calculator depends on validator functionality but doesn't store references
o A "uses-a" temporary relationship for validation purposes
These examples provide additional practice with identifying and implementing the main types of
relationships in object-oriented programming, following the format of your lab sheet.