"Believe in yourself.
You are capable of achieving great things—one step, one effort,
one success at a time."
OOPS Q/A
Object Array in Java
1. Introduction to Object Arrays
● In Java, an array is a collection of elements of the same data type.
● When the array stores objects instead of primitive data types (int, float, etc.), it is called an
Object Array.
● Object arrays allow storing multiple objects in a single variable.
2. Declaring and Creating an Object Array
Syntax:
ClassName[] arrayName = new ClassName[size];
● ClassName → Name of the class (object type).
● arrayName → Name of the array.
● size → Number of objects the array can store.
Example:
Student[] students = new Student[5]; // Array to store 5 Student objects
3. Initializing an Object Array
There are two ways to initialize an object array:
1. Using new keyword and assigning objects individually
2. Using array initialization in a single line
Example 1: Assigning Objects Individually
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
void display() {
System.out.println("Name: " + name + ", Age: " + age);
public class ObjectArrayExample {
public static void main(String[] args) {
// Creating an object array
Student[] students = new Student[3];
// Initializing objects
students[0] = new Student("Anup", 20);
students[1] = new Student("Bushan", 21);
students[2] = new Student("Chetan", 22);
// Accessing objects in the array
for (int i = 0; i < students.length; i++) {
students[i].display();
Output:
Name: Anup, Age: 20
Name: Bushan, Age: 21
Name: Chetan, Age: 22
Example 2: Direct Initialization
Student[] students = {
new Student("Anup", 20),
new Student("Bhushan", 21),
new Student("Chetan", 22)
};
4. Accessing Elements in an Object Array
● Use indexing to access and modify objects.
● Example:
students[1].name = "David"; // Modifying the object at index 1
System.out.println(students[1].name); // Output: David
5. Object Array with Scanner Input
● Taking user input for object arrays:
import java.util.Scanner;
class Employee {
String name;
double salary;
Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
void display() {
System.out.println("Employee Name: " + name + ", Salary: " + salary);
public class EmployeeArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of employees: ");
int n = sc.nextInt();
sc.nextLine(); // Consume newline
Employee[] employees = new Employee[n];
// Taking input for each employee
for (int i = 0; i < n; i++) {
System.out.print("Enter name for employee " + (i + 1) + ": ");
String name = sc.nextLine();
System.out.print("Enter salary for employee " + (i + 1) + ": ");
double salary = sc.nextDouble();
sc.nextLine(); // Consume newline
employees[i] = new Employee(name, salary);
}
// Displaying employee details
System.out.println("\nEmployee Details:");
for (Employee emp : employees) {
emp.display();
sc.close();
6. Object Array in Constructor
● Object arrays can be used inside constructors to initialize multiple objects.
class Book {
String title;
Book(String title) {
this.title = title;
class Library {
Book[] books;
Library(Book[] books) {
this.books = books;
void displayBooks() {
for (Book b : books) {
System.out.println("Book: " + b.title);
public class LibraryDemo {
public static void main(String[] args) {
Book[] bookArray = {new Book("Java Basics"), new Book("OOP Concepts"), new Book("Data
Structures")};
Library lib = new Library(bookArray);
lib.displayBooks();
7. Advantages of Object Arrays
✅✅Stores multiple objects in a single reference.
✅ Easy to manage large data sets.
Provides better code organization.
8. Limitations of Object Arrays
❌❌Fixed size (cannot grow dynamically).
Requires manual initialization of each object.
For dynamic object storage, use ArrayList instead of arrays.
9. Alternative: Using ArrayList for Objects
● If the number of objects is unknown, use ArrayList instead:
import java.util.ArrayList;
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
void display() {
System.out.println("Name: " + name + ", Age: " + age);
public class StudentList {
public static void main(String[] args) {
ArrayList<Student> studentList = new ArrayList<>();
studentList.add(new Student("Alice", 20));
studentList.add(new Student("Bob", 21));
for (Student s : studentList) {
s.display();
********************************************************
P) Write a Java program to create a class "Flight" having flight number, flight name, source,
destination, and fare. Accept data for N flights and display details of flights where fare is between
Rs. 2000 and Rs. 5000. (Use array of objects)
Ans:a Java program that defines a Flight class with attributes for flight number, flight name,
source, destination, and fare. It then accepts details for N flights, stores them in an array of
objects, and displays only those flights with fares between Rs. 2000 and Rs. 5000.
Java Program:
import java.util.Scanner;
class Flight {
int flightNumber;
String flightName, source, destination;
double fare;
// Constructor to initialize flight details
Flight(int flightNumber, String flightName, String source, String destination, double fare) {
this.flightNumber = flightNumber;
this.flightName = flightName;
this.source = source;
this.destination = destination;
this.fare = fare;
}
// Method to display flight details
void displayFlight() {
System.out.println("Flight Number: " + flightNumber);
System.out.println("Flight Name : " + flightName);
System.out.println("Source : " + source);
System.out.println("Destination : " + destination);
System.out.println("Fare : Rs. " + fare);
System.out.println("--------------------------------------");
}
}
public class FlightDetails {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Accept number of flights
System.out.print("Enter number of flights: ");
int n = scanner.nextInt();
// Create an array of Flight objects
Flight[] flights = new Flight[n];
// Accept flight details
for (int i = 0; i < n; i++) {
System.out.println("\nEnter details for Flight " + (i + 1) + ": ");
System.out.print("Flight Number: ");
int flightNumber = scanner.nextInt();
scanner.nextLine(); // Consume newline
System.out.print("Flight Name: ");
String flightName = scanner.nextLine();
System.out.print("Source: ");
String source = scanner.nextLine();
System.out.print("Destination: ");
String destination = scanner.nextLine();
System.out.print("Fare: ");
double fare = scanner.nextDouble();
// Store flight object in the array
flights[i] = new Flight(flightNumber, flightName, source, destination, fare);
}
// Display flights with fare between Rs. 2000 and Rs. 5000
System.out.println("\nFlights with fare between Rs. 2000 and Rs. 5000:");
boolean found = false;
for (Flight flight : flights) {
if (flight.fare >= 2000 && flight.fare <= 5000) {
flight.displayFlight();
found = true;
}
}
if (!found) {
System.out.println("No flights found in the specified fare range.");
}
scanner.close();
}
}
Explanation:
1. Class Flight
○ Stores details like flight number, flight name, source, destination, and fare.
○ Constructor initializes these details.
○ displayFlight() method prints flight details.
2. Class FlightDetails (Main Program)
○ Accepts N flight details from the user.
○ Stores them in an array of Flight objects.
○ Iterates through the array to display flights with fares between Rs. 2000 and Rs. 5000.
Sample Output:
Enter number of flights: 3
Enter details for Flight 1:
Flight Number: 101
Flight Name: Air India
Source: Mumbai
Destination: Delhi
Fare: 4500
Enter details for Flight 2:
Flight Number: 102
Flight Name: Indigo
Source: Chennai
Destination: Bangalore
Fare: 1800
Enter details for Flight 3:
Flight Number: 103
Flight Name: SpiceJet
Source: Pune
Destination: Kolkata
Fare: 3000
Flights with fare between Rs. 2000 and Rs. 5000:
Flight Number: 101
Flight Name : Air India
Source : Mumbai
Destination : Delhi
Fare : Rs. 4500
--------------------------------------
Flight Number: 103
Flight Name : SpiceJet
Source : Pune
Destination : Kolkata
Fare : Rs. 3000
--------------------------------------
*********************************************************************************
P) Write a complete Java program for creating a class Movie with data member's movie number,
movie name, release year, budget. Write methods to input information for N movies and to print
the information of movies having budget between 4,00,00,000 to Rs. 6,00,00,000. (Use an array of
objects).
Ans:
Here is a complete Java program to create a Movie class with attributes:
● Movie Number
● Movie Name
● Release Year
● Budget
The program allows the user to input details for N movies and then prints movies with a budget
between ₹4,00,00,000 and ₹6,00,00,000 using an array of objects.
Java Program: Movie Class with Array of Objects
import java.util.Scanner;
class Movie {
// Data Members
private int movieNumber;
private String movieName;
private int releaseYear;
private double budget;
// Constructor
public Movie(int movieNumber, String movieName, int releaseYear, double budget) {
this.movieNumber = movieNumber;
this.movieName = movieName;
this.releaseYear = releaseYear;
this.budget = budget;
}
// Method to check if the movie's budget is in the specified range
public boolean isBudgetInRange() {
return (budget >= 400000000 && budget <= 600000000);
}
// Method to display movie details
public void displayMovie() {
System.out.println("Movie Number: " + movieNumber);
System.out.println("Movie Name: " + movieName);
System.out.println("Release Year: " + releaseYear);
System.out.println("Budget: ₹" + budget);
System.out.println("--------------------------");
}
}
public class MovieDatabase {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Input number of movies
System.out.print("Enter the number of movies: ");
int N = scanner.nextInt();
scanner.nextLine(); // Consume newline
// Create an array of Movie objects
Movie[] movies = new Movie[N];
// Input movie details
for (int i = 0; i < N; i++) {
System.out.println("\nEnter details for Movie " + (i + 1) + ":");
System.out.print("Enter Movie Number: ");
int movieNumber = scanner.nextInt();
scanner.nextLine(); // Consume newline
System.out.print("Enter Movie Name: ");
String movieName = scanner.nextLine();
System.out.print("Enter Release Year: ");
int releaseYear = scanner.nextInt();
System.out.print("Enter Budget (in ₹): ");
double budget = scanner.nextDouble();
// Store movie in array
movies[i] = new Movie(movieNumber, movieName, releaseYear, budget);
}
// Display movies with budget in range
System.out.println("\nMovies with a budget between ₹4,00,00,000 and ₹6,00,00,000:");
boolean found = false;
for (Movie movie : movies) {
if (movie.isBudgetInRange()) {
movie.displayMovie();
found = true;
}
}
if (!found) {
System.out.println("No movies found in the specified budget range.");
}
scanner.close();
}
}
How the Program Works?
1. Takes input for N movies from the user.
2. Stores movie details in an array of objects.
3. Filters and displays only movies with a budget between ₹4,00,00,000 and ₹6,00,00,000.
4. If no movies match, it displays a message.
Example Run:
Enter the number of movies: 3
Enter details for Movie 1:
Enter Movie Number: 101
Enter Movie Name: Avengers Endgame
Enter Release Year: 2019
Enter Budget (in ₹): 500000000
Enter details for Movie 2:
Enter Movie Number: 102
Enter Movie Name: Inception
Enter Release Year: 2010
Enter Budget (in ₹): 1600000000
Enter details for Movie 3:
Enter Movie Number: 103
Enter Movie Name: Interstellar
Enter Release Year: 2014
Enter Budget (in ₹): 450000000
Movies with a budget between ₹4,00,00,000 and ₹6,00,00,000:
Movie Number: 101
Movie Name: Avengers Endgame
Release Year: 2019
Budget: ₹500000000
--------------------------
Movie Number: 103
Movie Name: Interstellar
Release Year: 2014
Budget: ₹450000000
--------------------------
***********************************************
P) Explain the concept of Data Structure in detail. Also explain Abstract data types.
Ans:
Data Structure: Definition and Concept
A Data Structure is a way of organizing, managing, and storing data efficiently to enable easy access
and modification. It is a crucial concept in computer science that helps in optimizing algorithms,
improving performance, and ensuring data integrity. Data structures are used in various applications
such as databases, operating systems, artificial intelligence, and networking.
Types of Data Structures
Data structures are broadly classified into two categories:
1. Linear Data Structures: Data elements are arranged sequentially, and each element is
connected to its previous and next element. Examples include:
○ Array: A fixed-size collection of elements of the same data type.
○ Linked List: A collection of nodes where each node points to the next node.
○ Stack: A Last In, First Out (LIFO) structure used for recursion, backtracking, etc.
○ Queue: A First In, First Out (FIFO) structure used in scheduling, buffering, etc.
2. Non-Linear Data Structures: Data elements are connected in a hierarchical manner,
allowing multiple relationships. Examples include:
○ Tree: A hierarchical structure with a root node and child nodes.
○ Graph: A set of nodes (vertices) connected by edges.
○ Hash Table: A key-value pair data structure used for efficient searching and
indexing.
Abstract Data Types (ADT)
An Abstract Data Type (ADT) is a mathematical model that defines a data structure purely by its
behavior rather than its implementation. It specifies what operations can be performed on the data
and their expected behavior but does not define how these operations are implemented.
Characteristics of ADT:
● Encapsulation: Data and operations are encapsulated together.
● Independence: ADT defines functionality without specifying implementation details.
● Modularity: ADTs make programs easier to design and maintain.
Examples of ADTs:
1. List ADT: Supports operations like insertion, deletion, searching, and traversal.
2. Stack ADT: Supports push(), pop(), and peek() operations.
3. Queue ADT: Supports enqueue(), dequeue(), and isEmpty().
4. Deque ADT (Double-ended queue): Supports insertion and deletion from both ends.
5. Set ADT: Supports operations like union, intersection, and difference.
6. Map ADT (Dictionary): Supports key-value pair operations like insertion, deletion, and
searching.
Difference Between Data Structure and Abstract Data Type (ADT)
Aspect Data Structure Abstract Data Type (ADT)
Definition Concrete implementation of Theoretical model describing behavior
data organization
Implementation Specifies how data is stored and Only defines operations without
manipulated implementation details
Example Arrays, Linked Lists, Trees Stack, Queue, Set, Map
Focus Memory management and Functionality and usability
performance
**********************************************************************************
P)Explain Reverse Polish notation convert the following notation to postfix using stack show all
stack positions. A+(B * C-(D/E) * F) * H
Ans:
Reverse Polish Notation (Postfix Notation)
Reverse Polish Notation (RPN), also known as Postfix Notation, is a mathematical notation where the
operator follows the operands. It eliminates the need for parentheses, making it easy to evaluate
expressions using a stack.
Conversion Rules (Infix to Postfix)
1. Operands (A, B, C, etc.) → Directly added to the output.
2. Left Parenthesis ‘(’ → Pushed onto the stack.
3. Right Parenthesis ‘)’ → Pop from the stack to output until ‘(’ is found (discard ‘(’).
4. Operators (+, -, *, /, etc.):
○ If the stack is empty → Push onto the stack.
○ If the stack contains operators with higher or equal precedence, pop and output
them before pushing the new operator.
○ Otherwise, push the new operator.
Operator Precedence Table
Given Infix Expression
A+(B∗C−(D/E)∗F)∗H
Step-by-Step Conversion to Postfix Using Stack
We will process the expression character by character, using a stack for operators.
Final Postfix Expression
ABC∗DE/F∗−H∗+
Conclusion
● Parentheses help in grouping expressions, but they are eliminated in Postfix.
● Stack is used to manage operators and precedence correctly.
● Postfix notation is beneficial for stack-based evaluation without parentheses
*********************************************************************************
P) Write an algorithm to create a singly linked list to store the details of N products in a shop. Each
record should contain Product ID, Product Name, and Product Price. Also, write an algorithm to
find and display the product with the minimum price.
Ans:
Algorithm to Create a Singly Linked List for N Products
1. Define a structure (node) for the linked list containing:
○ Product ID
○ Product Name
○ Product Price
○ Pointer to the next node
2. Initialize head as NULL.
3. For each product (N times):
○ Create a new node.
○ Input product details (ID, Name, Price).
○ If the list is empty, set head to the new node.
○ Otherwise, traverse to the end and append the new node.
Algorithm to Find and Display the Product with Minimum Price
1. Check if the list is empty:
○ If head == NULL, print "List is empty" and exit.
2. Initialize minNode as head.
3. Traverse the list:
○ Compare each node’s Product Price with minNode->Product Price.
○ If a node has a lower price, update minNode.
4. Print the details of minNode.
Pseudocode:
Algorithm CreateLinkedList(N)
1. Define structure Node:
- ProductID (Integer)
- ProductName (String)
- ProductPrice (Float)
- Next (Pointer to Node)
2. Initialize head = NULL
3. Repeat for i = 1 to N:
a. Create a new node temp
b. Input ProductID, ProductName, ProductPrice
c. temp->Next = NULL
d. If head is NULL:
- head = temp
Else:
- Traverse to the last node
- Set last node’s Next = temp
4. End
Algorithm FindMinPriceProduct()
1. If head == NULL:
- Print "List is empty"
- Return
2. Initialize minNode = head
3. Set current = head
4. While current is not NULL:
a. If current->ProductPrice < minNode->ProductPrice:
- minNode = current
b. Move current to the next node
5. Print minNode->ProductID, minNode->ProductName, minNode->ProductPrice
6. End
**********************************************************************************
“Discipline is the bridge between goals and accomplishment.”
************************************************************************
P) Write an algorithm to count the number of nodes in a doubly linked list.
Ans:
Algorithm to Count the Number of Nodes in a Doubly Linked List
A doubly linked list consists of nodes where each node has:
● Data
● A pointer to the Next node
● A pointer to the Previous node
The algorithm counts the number of nodes by traversing the list from the head to the last node.
Algorithm:
Algorithm CountNodes(head)
1. If head is NULL:
- Print "List is empty"
- Return 0
2. Initialize count = 0
3. Set current = head
4. While current is not NULL:
a. Increment count
b. Move current to the next node (current = current->Next)
5. Return count
6. End
Explanation
1. Check if the list is empty:
○ If head == NULL, print "List is empty" and return 0.
2. Initialize count = 0.
3. Traverse the list:
○ Start from head and move to Next node until NULL is reached.
○ Increment count for each node.
4. Return the count after traversal ends.
******************************************************
P) Write an algorithm to delete a node after a given node in a doubly linked list.
Ans:
Algorithm to Delete a Node After a Given Node in a Doubly Linked List
In a Doubly Linked List (DLL), each node contains:
● Data
● Pointer to the Next Node
● Pointer to the Previous Node
To delete a node after a given node, follow these steps:
Algorithm
Algorithm DeleteNodeAfter(givenNode)
1. If givenNode is NULL or givenNode->Next is NULL:
- Print "Deletion not possible"
- Return
2. Set temp = givenNode->Next (Node to be deleted)
3. Update givenNode->Next to temp->Next
4. If temp->Next is not NULL:
- Set temp->Next->Prev = givenNode
5. Free temp (Delete the node)
6. End
Explanation
1. Check if deletion is possible:
○ If givenNode is NULL or givenNode->Next is NULL, deletion is not possible.
2. Identify the node to delete:
○ temp = givenNode->Next
3. Update the next pointer of givenNode:
○ givenNode->Next = temp->Next
4. Update the previous pointer of the next node (if it exists):
○ temp->Next->Prev = givenNode
5. Free the memory allocated to temp.
Example
Before Deletion
HEAD → [10] ↔ [20] ↔ [30] ↔ [40] ↔ [50] → NULL
If givenNode = 30, then node 40 is deleted.
After Deletion
HEAD → [10] ↔ [20] ↔ [30] ↔ [50] → NULL
******************************************************
P) Explain the concept of Order of Growth and how it relates to Asymptotic Notations.
Ans:
Order of Growth and Its Relation to Asymptotic Notations
1. What is Order of Growth?
The Order of Growth describes how the running time (or space) of an algorithm increases with the
input size (n). It helps compare algorithms based on their efficiency by focusing on the dominant
term that affects their performance.
For example:
● If an algorithm takes 5n² + 3n + 2 operations, the order of growth is O(n²) (ignoring constant
factors and lower-order terms).
The faster the order of growth, the slower the algorithm performs as n increases.
2. What are Asymptotic Notations?
Asymptotic Notations describe the mathematical bounds of an algorithm’s time or space
complexity for large input sizes. They express the efficiency of an algorithm independently of
machine specifications.
The three main asymptotic notations are:
1. Big-O Notation (O) → Upper Bound (Worst Case)
○ Represents the maximum time an algorithm will take in the worst-case scenario.
○ Example: O(n²) means the algorithm’s running time won’t exceed a quadratic
function.
○ Used for pessimistic analysis.
2. Big-Theta (Θ) → Tight Bound (Average Case)
○ Represents both the upper and lower bound, meaning the algorithm always runs
within this bound.
○ Example: Θ(n log n) means the time complexity is neither worse nor better than n log
n for large n.
3. Big-Omega (Ω) → Lower Bound (Best Case)
○ Represents the minimum time an algorithm will take in the best-case scenario.
○ Example: Ω(n) means the algorithm at least takes linear time.
3. Relationship Between Order of Growth and Asymptotic Notations
● The order of growth helps determine the asymptotic complexity of an algorithm.
● Asymptotic notations formalize the order of growth to provide performance guarantees.
● By analyzing the dominant term, we classify algorithms into complexity classes such as O(1),
O(log n), O(n), O(n log n), O(n²), etc.
● A lower order of growth means a more efficient algorithm.
Comparing Order of Growth:
As n grows, O(2ⁿ) grows much faster than O(n log n), making it far less efficient.
Algorithm Time Complexity Order of Growth
Binary Search O(log n) Logarithmic
Merge Sort O(n log n) Linearithmic
Bubble Sort O(n²) Quadratic
Fibonacci (Recursion) O(2ⁿ) Exponential
P) Explain Asymptotic notation and its classification in short.
Ans:
Asymptotic Notation and Its Classification
What is Asymptotic Notation?
Asymptotic notation is a mathematical tool used to describe the efficiency of an algorithm in terms
of time or space complexity as the input size (n) grows large. It helps in analyzing the growth rate of
an algorithm while ignoring constant factors and lower-order terms.
Classification of Asymptotic Notation
There are three main types:
1. Big-O Notation (O) → Upper Bound (Worst Case)
○ Represents the maximum time an algorithm can take in the worst-case scenario.
○ Example: O(n²) means the algorithm’s time complexity does not exceed n²
operations.
○ Used for performance guarantees.
2. Big-Omega Notation (Ω) → Lower Bound (Best Case)
○ Represents the minimum time an algorithm will take in the best-case scenario.
○ Example: Ω(n) means the algorithm at least runs in linear time.
3. Big-Theta Notation (Θ) → Tight Bound (Average Case)
○ Represents both the upper and lower bound, meaning the algorithm always runs
within this bound.
○ Example: Θ(n log n) means the time complexity is neither worse nor better than n log
n for large n.
Comparison of Growth Rates:
Notation Growth Rate Example Algorithms
O(1) Constant Hash Table Lookup
O(log n) Logarithmic Binary Search
O(n) Linear Linear Search
O(n log n) Linearithmic Merge Sort, Quick Sort
(Best/Average)
O(n²) Quadratic Bubble Sort, Insertion Sort
O(2ⁿ) Exponential Recursive Fibonacci
🔹 Lower order of growth → More efficient algorithm.
🔹 Big-O is most commonly used in algorithm analysis.
****************************************************************
P)Difference Between Time Complexity and Space Complexity.
Ans:
Aspect Time Complexity Space Complexity
Definition Measures the execution time of Measures the memory usage of an
an algorithm relative to input size. algorithm relative to input size.
Focus Amount of time an algorithm Amount of memory (RAM) an algorithm
takes to complete. requires for execution.
Primary Efficiency in terms of time. Efficiency in terms of memory usage.
Concern
Analysis Number of operations or Memory allocation for variables, data
Approach computational steps relative to structures, and function calls relative to
input size. input size.
Input Size Larger inputs usually lead to Larger inputs may require more memory
Impact longer execution times. for storing data structures or managing
recursion.
Optimization Reducing the number of Minimizing the amount of memory
Goal computational operations or needed for data storage and processing.
steps.
Typical Finding an element using binary Creating a 2D array of size n x n (O(n²)
Example search (O(log n) time complexity). space complexity).
**********
P) Write a Java program to design a class named as ‘Vehicle’ and test the ‘Vehicle’ class.
Representing following members:
Instance Variables:-
- Vehicle Number, Vehicle Name, Price, Year, Fuel Type.
Methods:-
- Initialize variables- Input Vehicle data- Display data.
Ans:
import java.util.Scanner;
// Vehicle class
class Vehicle {
// Instance variables
String vehicleNumber;
String vehicleName;
double price;
int year;
String fuelType;
// Method to initialize default values
void initialize() {
vehicleNumber = "Not Assigned";
vehicleName = "Unknown";
price = 0.0;
year = 0;
fuelType = "Not Specified";
}
// Method to input vehicle data
void inputData() {
Scanner sc = new Scanner(System.in);
System.out.print("Enter Vehicle Number: ");
vehicleNumber = sc.nextLine();
System.out.print("Enter Vehicle Name: ");
vehicleName = sc.nextLine();
System.out.print("Enter Price: ");
price = sc.nextDouble();
System.out.print("Enter Manufacturing Year: ");
year = sc.nextInt();
sc.nextLine(); // consume newline
System.out.print("Enter Fuel Type: ");
fuelType = sc.nextLine();
}
// Method to display vehicle data
void displayData() {
System.out.println("\n--- Vehicle Details ---");
System.out.println("Vehicle Number: " + vehicleNumber);
System.out.println("Vehicle Name: " + vehicleName);
System.out.println("Price: ₹" + price);
System.out.println("Year: " + year);
System.out.println("Fuel Type: " + fuelType);
}
}
// Test class
public class VehicleTest {
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
v1.initialize(); // Optional initialization
Explanation
● The class Vehicle contains instance variables to store the vehicle details.
● The method initialize() sets default values (optional).
● The method inputData() collects input from the user.
● The method displayData() prints the details.
● VehicleTest is the main class to test everything.
*******
P) Design a Java program to implement matrix multiplication of two 3 X 3 matrix using
two-dimensional arrays. Explain how arrays are stored in memory in Java.
Ans:
public class MatrixMultiplication {
public static void main(String[] args) {
// Define two 3x3 matrices
int[][] matrixA = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int[][] matrixB = {
{9, 8, 7},
{6, 5, 4},
{3, 2, 1}
};
// Resultant matrix
int[][] result = new int[3][3];
// Matrix multiplication logic
for (int i = 0; i < 3; i++) { // row of matrixA
for (int j = 0; j < 3; j++) { // column of matrixB
for (int k = 0; k < 3; k++) { // column of matrixA / row of matrixB
result[i][j] += matrixA[i][k] * matrixB[k][j];
}
}
// Displaying the result
System.out.println("Result of Matrix Multiplication:");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(result[i][j] + "\t");
}
System.out.println();
}
}
}
Output Example
Result of Matrix Multiplication:
30 24 18
84 69 54
138 114 90
How Arrays Are Stored in Memory in Java
1. Reference Type:
Arrays in Java are objects. When you create an array, a reference to the memory location is
stored, not the data directly.
2. Heap Memory:
All arrays are allocated in the heap memory, and the reference is stored in the stack.
3. Row-Major Order:
Java stores 2D arrays as an array of arrays, not as a flat row-major block like in C. Each row is
itself a reference to another 1D array.
4. Memory Layout Example:
int[][] arr = new int[3][3];
Internally:
● arr points to an array of 3 elements (arr[0], arr[1], arr[2])
● Each arr[i] points to a separate array of 3 integers
Advantages:
● Flexibility (e.g., jagged arrays – different row sizes)
● Garbage collection handles memory management
**********
P) Consider a real-life example of an ATM System. Analyze the system and identify:
i) Which parts of the ATM System should be abstracted and why?
ii) Which parts of the ATM System should be encapsulated within a class and why?
Ans:
i) Parts of the ATM System that Should Be Abstracted (Abstraction)
Abstraction means showing only essential features to the user and hiding complex internal logic. In
an ATM, the user interacts with simplified operations, while the underlying processes are hidden.
Examples of Abstracted Parts:
Why Abstraction?
To make the system user-friendly and hide internal complexity. It provides only necessary info and
operations to the user.
ii) Parts of the ATM System that Should Be Encapsulated (Encapsulation)
Encapsulation means binding data and methods together into a class and restricting direct access
to some of the object’s components.
Examples of Encapsulated Parts:
Why Encapsulation?
To protect data, enhance security (especially for sensitive info like PIN and balance), and maintain
control over how data is accessed/modified.
Abstraction hides what happens (simple user interface).
Encapsulation hides how it happens (internal logic & sensitive data handling).
************
P) Illustrate implementation of multiple inheritance using interfaces with the help of java code.
Ans:
In Java, multiple inheritance is not allowed with classes due to ambiguity issues (like the diamond
problem), but it is supported through interfaces.
Here's a simple example to illustrate multiple inheritance using interfaces in Java:
// First interface
interface Printable {
void print();
}
// Second interface
interface Showable {
void show();
}
// A class implementing both interfaces
class Document implements Printable, Showable {
public void print() {
System.out.println("Printing Document...");
}
public void show() {
System.out.println("Showing Document...");
}
}
// Main class to test
public class InterfaceTest {
public static void main(String[] args) {
Document doc = new Document();
doc.print();
doc.show();
}
}
Explanation
● Printable and Showable are two interfaces.
● Document class implements both interfaces, providing definitions for all methods.
● This simulates multiple inheritance as Document inherits behavior from both Printable and
Showable.
✅ Benefits of Using Interfaces for Multiple Inheritance:
● Avoids ambiguity of multiple base class implementations.
● Encourages the use of contracts (what a class must do, not how).
● Supports flexible design and loose coupling.
************
P) Compare stack-based expression evaluation versus recursive expression evaluation.
Ans:
Example Illustration
Stack-Based (Postfix)
For 23*54*+9- →
Steps:
● 2 * 3 = 6
● 5 * 4 = 20
● 6 + 20 = 26
● 26 - 9 = 17
Final result: 17
Recursive (Infix)
For (2 + (3 * 5))
● Evaluate 3 * 5 → 15
● Then 2 + 15 → 17
************
P) With a real-life example, explain how access specifiers are useful in
developing large-scale software systems.
Ans:
Access specifiers (like private, protected, and public in languages like C++/Java) play a critical role in
large-scale software development by supporting encapsulation, modularity, and data protection.
Let’s understand this through a real-life example:
Real-Life Example: Bank Management System
Imagine you are developing a Bank Management System with multiple classes:
● BankAccount
● Customer
● Transaction
● Admin
In the BankAccount class, you have sensitive data like:
class BankAccount {
private String accountNumber;
private double balance;
public void deposit(double amount) { ... }
public void withdraw(double amount) { ... }
public double getBalance() { return balance; }
}
How Access Specifiers Help:
1. private members (like balance)
○ Ensure that the balance cannot be modified directly from outside the class.
○ Without this, a careless or malicious piece of code could directly set balance = 0;,
compromising data integrity.
2. public methods (like deposit() and withdraw())
○ Provide controlled access to modify the balance with proper checks (e.g., insufficient
funds).
3. protected members (used in inheritance)
○ Useful if BankAccount is extended by a subclass like SavingsAccount, where you may
want to allow limited access to internal details.
Why It’s Crucial in Large-Scale Systems
In a large team, multiple developers work on different modules. If access specifiers are not properly
used:
● One developer could unintentionally break another module by changing internal data.
● Bugs and security issues can creep in easily due to lack of clear boundaries between
components.
● It becomes difficult to maintain or scale the system.
Using access specifiers ensures each module exposes only what’s necessary, like a "black box," and
hides internal complexity, reducing bugs and enhancing code robustness.
**************
P) Create a class called ‘BankAccount’ that contains account number, account holder name,
account type, and balance. Include methods to initialize, input data, display account details, and
check balance. Write a test class to demonstrate.
Ans:
class BankAccount:
def __init__(self):
self.account_number = ""
self.holder_name = ""
self.account_type = ""
self.balance = 0.0
def input_data(self):
self.account_number = input("Enter Account Number: ")
self.holder_name = input("Enter Account Holder Name: ")
self.account_type = input("Enter Account Type (e.g., Savings/Current): ")
self.balance = float(input("Enter Initial Balance: "))
def display_account_details(self):
print("\n--- Account Details ---")
print(f"Account Number : {self.account_number}")
print(f"Holder Name : {self.holder_name}")
print(f"Account Type : {self.account_type}")
print(f"Balance : ₹{self.balance:.2f}")
def check_balance(self):
print(f"Current Balance: ₹{self.balance:.2f}")
# Test Class to demonstrate
def test_bank_account():
account = BankAccount()
account.input_data()
account.display_account_details()
account.check_balance()
# Call the test function
if __name__ == "__main__":
test_bank_account()
Output (When run):
Enter Account Number: 123456
Enter Account Holder Name: Ramesh Kumar
Enter Account Type (e.g., Savings/Current): Savings
Enter Initial Balance: 10000
--- Account Details ---
Account Number : 123456
Holder Name : Ramesh Kumar
Account Type : Savings
Balance : ₹10000.00
Current Balance: ₹10000.0
*************
P) Write a program to find the sum of each row and each column of a 4x4 matrix using arrays in
Java. Explain the memory layout of a 2D array.
Ans: import java.util.Scanner;
public class MatrixSum {
public static void main(String[] args) {
int[][] matrix = new int[4][4];
Scanner sc = new Scanner(System.in);
// Input matrix elements
System.out.println("Enter elements of 4x4 matrix:");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
matrix[i][j] = sc.nextInt();
}
}
// Sum of each row
System.out.println("\nSum of each row:");
for (int i = 0; i < 4; i++) {
int rowSum = 0;
for (int j = 0; j < 4; j++) {
rowSum += matrix[i][j];
}
System.out.println("Row " + (i + 1) + ": " + rowSum);
}
// Sum of each column
System.out.println("\nSum of each column:");
for (int j = 0; j < 4; j++) {
int colSum = 0;
for (int i = 0; i < 4; i++) {
colSum += matrix[i][j];
}
System.out.println("Column " + (j + 1) + ": " + colSum);
}
sc.close();
}
}
Memory Layout of a 2D Array in Java
In Java, a 2D array is implemented as an array of arrays, not a true matrix as in languages like C or
C++.
For example:
int[][] matrix = new int[4][4];
This means:
● matrix is a reference to an array of 4 arrays (int[4][]).
● Each matrix[i] is itself a reference to an array of 4 integers (int[4]).
🔍 Internal Layout:
It can be visualized like:
matrix → [ ref → [int, int, int, int],
ref → [int, int, int, int],
ref → [int, int, int, int],
ref → [int, int, int, int] ]
● This layout is also called "row-major order."
● Memory is allocated in heap, and each row is independently allocated.
💡 Implications:
● You can have jagged arrays (e.g., new int[4][] with rows of different lengths).
● Accessing matrix[i][j] involves two pointer dereferences: first to matrix[i], then to matrix[i][j].
***************
P) In the case of a Student Management System in a university, explain:
(i) Functionalities that should be abstracted for students and staff.
(ii) Data like student grades, attendance, and fees that should be
encapsulated within classes, and why?
Ans:
In a Student Management System (SMS) for a university, abstraction and encapsulation play key
roles in designing a secure, maintainable, and scalable software system.
(i) Functionalities that Should Be Abstracted
Abstraction means exposing only essential functionalities while hiding internal details. Let’s break
this down for both students and staff:
👨🎓 For Students:
● View personal profile (name, roll number, course, etc.)
● View grades/marks for each semester
● Check attendance percentage
● Pay fees or view payment history
● Register for courses or exams
● Access notifications or announcements
● Apply for leave or request transcripts
➤ Internal operations like database connections, validation rules, and logic for
calculating GPA should be hidden from the student.
👩🏫 For Staff (Faculty/Admin):
● Add/update student records
● Mark attendance
● Enter or update grades
● Approve course registration
● Generate reports (grade sheets, attendance logs, etc.)
● Manage fee records and payments
● Send notifications to students
➤ Backend validation, access control, or complex business rules are abstracted away
from staff to simplify their interaction.
🔐 (ii) Data That Should Be Encapsulated (and Why)
Encapsulation is the process of hiding internal data and only exposing it via methods. It protects
data integrity and enforces access rules.
✅ Data to Encapsulate:
Data Why Encapsulate?
Grades (marks, GPA) Prevent unauthorized changes; only teachers/admin should
modify.
Attendance Accuracy and tamper-proof; students shouldn't alter their record.
Fee Payment Info Financial data needs privacy and validation.
Login Credentials Secure sensitive access information.
Student Personal Info Ensure data privacy and comply with regulations like FERPA.
🧾 Example in Java:
java
CopyEdit
class Student {
private String name;
private String rollNo;
private double[] grades;
private int attendance;
private double feesPaid;
public void setGrades(double[] newGrades) {
// Only allow update after validation
this.grades = newGrades;
}
public double[] getGrades() {
return grades;
}
// Other getters/setters for controlled access
}
🔐 Encapsulation ensures that changes to internal data must go through well-defined
interfaces, reducing bugs and improving security.
● Abstraction simplifies the user interface for students and staff by hiding complexity.
● Encapsulation protects sensitive student data (like grades, attendance, and fees) from
unauthorized access or manipulation.
****************
P) Design a Java program to simulate multiple inheritance using interfaces where a class
SmartPhone implements both Camera and MusicPlayer interfaces. Each interface contains
different methods.
Ans:
Java does not support multiple inheritance with classes, but it does support multiple inheritance
through interfaces, which is ideal for defining shared behavior without conflict.
Here’s a program that simulates multiple inheritance using Camera and MusicPlayer interfaces, both
implemented by a class called SmartPhone.
// Interface 1: Camera
interface Camera {
void takePhoto();
void recordVideo();
}
// Interface 2: MusicPlayer
interface MusicPlayer {
void playMusic();
void stopMusic();
}
// Class implementing both interfaces
class SmartPhone implements Camera, MusicPlayer {
// Implementing Camera methods
public void takePhoto() {
System.out.println("Taking a photo with 108MP camera...");
}
public void recordVideo() {
System.out.println("Recording 4K video...");
}
// Implementing MusicPlayer methods
public void playMusic() {
System.out.println("Playing music: 'Shape of You' by Ed Sheeran...");
}
public void stopMusic() {
System.out.println("Music stopped.");
}
}
// Test class
public class TestSmartPhone {
public static void main(String[] args) {
SmartPhone phone = new SmartPhone();
// Using camera functionality
phone.takePhoto();
phone.recordVideo();
// Using music player functionality
phone.playMusic();
phone.stopMusic();
}
}
Output:
Taking a photo with 108MP camera...
Recording 4K video...
Playing music: 'Shape of You' by Ed Sheeran...
Music stopped.
***************
P) Classify the different Access specifiers in Java with real life Examples.
Ans:
In Java, access specifiers (also called access modifiers) control visibility or accessibility of classes,
methods, and variables. These are essential for encapsulation, one of the core principles of OOP.
Here's a breakdown along with real-life analogies to help understand them better:
🔐 1. public
● Definition: The member is accessible from anywhere (within and outside the package).
● Real-life analogy: A public park — everyone (including people from other cities or countries)
can access it.
public class Library {
public void readBooks() {
System.out.println("Reading books in the public library");
}
}
✅ Usage: For APIs or features meant to be accessed globally.
🔏 2. private
● Definition: The member is accessible only within the same class.
● Real-life analogy: Your ATM PIN — only you (not even the bank teller) can see it.
public class BankAccount {
private double balance;
private void updateBalance() {
// Only accessible within this class
}
}
✅ Usage: For sensitive data like passwords, balance, or internal calculations.
🧩 3. protected
● Definition: Accessible within the same package and by subclasses (even in other packages
via inheritance).
● Real-life analogy: A school ID card — students of the school (subclasses) can access the
canteen, even if they come from different branches (packages).
class Person {
protected String name;
}
class Student extends Person {
void showName() {
System.out.println(name); // Accessible due to protected
}
}
✅ Usage: For superclass fields/methods intended for subclass use.
🏠 4. Default (Package-Private)
● Definition: If no specifier is given, it is accessible only within the same package.
● Real-life analogy: A residential building common area — only accessible to people living in
that building (package).
class Course {
void display() {
System.out.println("Course info - visible in same package");
}
}
✅ Usage: For utility/helper classes shared within the same project module.
******************
P) Write a Java program to select different actions from menu by the user including
1.Viewing account details. 3.Withdraw money.
2.Deposit money. 4.Exit.
Ans:
import java.util.Scanner;
class BankAccount {
private String accountNumber;
private String accountHolderName;
private double balance;
// Constructor to initialize account
public BankAccount(String accNo, String name, double initialBalance) {
this.accountNumber = accNo;
this.accountHolderName = name;
this.balance = initialBalance;
}
// View account details
public void viewAccountDetails() {
System.out.println("\n--- Account Details ---");
System.out.println("Account Number: " + accountNumber);
System.out.println("Account Holder: " + accountHolderName);
System.out.println("Balance: ₹" + balance);
}
// 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.");
}
}
// 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 balance or invalid amount.");
}
}
}
public class BankMenu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Create a sample bank account
BankAccount account = new BankAccount("1234567890", "John Doe", 10000);
int choice;
do {
// Display menu
System.out.println("\n--- Bank Menu ---");
System.out.println("1. View Account Details");
System.out.println("2. Deposit Money");
System.out.println("3. Withdraw Money");
System.out.println("4. Exit");
System.out.print("Enter your choice: ");
choice = sc.nextInt();
// Perform action based on choice
switch (choice) {
case 1:
account.viewAccountDetails();
break;
case 2:
System.out.print("Enter amount to deposit: ₹");
double depositAmount = sc.nextDouble();
account.deposit(depositAmount);
break;
case 3:
System.out.print("Enter amount to withdraw: ₹");
double withdrawAmount = sc.nextDouble();
account.withdraw(withdrawAmount);
break;
case 4:
System.out.println("Thank you for using our banking system!");
break;
default:
System.out.println("Invalid choice. Please try again.");
}
} while (choice != 4);
sc.close();
}
}
Sample Output
--- Bank Menu ---
1. View Account Details
2. Deposit Money
3. Withdraw Money
4. Exit
Enter your choice: 1
--- Account Details ---
Account Number: 1234567890
Account Holder: John Doe
Balance: ₹10000.0
*****************
P) Demonstrate the concept of queue in brief.
Ans:
Concept of Queue (in Java or general programming)
A queue is a linear data structure that follows the FIFO (First In, First Out) principle. This means the
element added first will be removed first, just like a real-life queue (e.g., people standing in line).
🔁 Real-life Analogy
Think of a line at a ticket counter:
● The first person in line gets served first.
● New people join at the end of the line.
● No one can skip the queue (unless it's a priority queue — a different topic).
🧱 Basic Operations
Operation Description
enqueue() Add element to the rear of the queue
dequeue() Remove element from the front
peek() View the front element without removing
isEmpty() Check if queue is empty
💡 Queue Implementation in Java
import java.util.LinkedList;
import java.util.Queue;
public class QueueDemo {
public static void main(String[] args) {
Queue<String> line = new LinkedList<>();
// Enqueue elements
line.add("Alice");
line.add("Bob");
line.add("Charlie");
System.out.println("Queue: " + line);
// Peek at front
System.out.println("Front of queue: " + line.peek());
// Dequeue
System.out.println("Removed: " + line.poll());
System.out.println("Queue after dequeue: " + line);
}
}
Output
Queue: [Alice, Bob, Charlie]
Front of queue: Alice
Removed: Alice
Queue after dequeue: [Bob, Charlie]
************
P) What do you mean by Inheritance in Java? Explain the different types of Inheritance with Java
code.
Ans:
What is Inheritance in Java?
Inheritance is an object-oriented programming concept in which one class (child/subclass) acquires
the properties and behaviors (fields and methods) of another class (parent/superclass).
🎯 Key Benefits of Inheritance:
● Code reusability
● Method overriding (polymorphism)
● Easy maintenance and scalability
Types of Inheritance in Java
Java supports the following types of inheritance:
Type Description
1. Single Inheritance A subclass inherits from one superclass.
2. Multilevel Inheritance A class inherits from a class which itself inherits another class.
3.Hierarchical Inheritance Multiple subclasses inherit from the same parent class.
4. Hybrid Inheritance A combination — Java doesn't support this directly via classes,
but through interfaces.
❌ Multiple Inheritance (with
classes)
Not supported directly due to ambiguity; use interfaces
instead.
✅ 1. Single Inheritance Example
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog barks");
}
}
public class SingleInheritance {
public static void main(String[] args) {
Dog d = new Dog();
d.sound(); // inherited
d.bark(); // own method
}
}
✅ 2. Multilevel Inheritance Example
class Animal {
void eat() {
System.out.println("Animal eats food");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog barks");
}
}
class Puppy extends Dog {
void weep() {
System.out.println("Puppy weeps");
}
}
public class MultilevelInheritance {
public static void main(String[] args) {
Puppy p = new Puppy();
p.eat(); // from Animal
p.bark(); // from Dog
p.weep(); // own method
}
}
✅ 3. Hierarchical Inheritance Example
class Animal {
void eat() {
System.out.println("Animal eats");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
void meow() {
System.out.println("Cat meows");
}
}
public class HierarchicalInheritance {
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
d.bark();
Cat c = new Cat();
c.eat();
c.meow();
}
}
✅ 4. Multiple Inheritance using Interfaces (Hybrid Example)
interface Camera {
void click();
}
interface MusicPlayer {
void playMusic();
}
class SmartPhone implements Camera, MusicPlayer {
public void click() {
System.out.println("Clicking photo...");
}
public void playMusic() {
System.out.println("Playing music...");
}
}
public class InterfaceInheritance {
public static void main(String[] args) {
SmartPhone sp = new SmartPhone();
sp.click();
sp.playMusic();
}
}
************
P) Elaborate the Concept of Encapsulation with syntax and also write suitable Java code.
Ans:
✅ Concept of Encapsulation in Java
Encapsulation is one of the four fundamental OOP principles, and it refers to wrapping data
(variables) and methods (functions) that operate on the data into a single unit — a class — and
restricting direct access to some of the object’s components.
🔒 Why is Encapsulation Important?
● Protects data from unauthorized access
● Improves modularity and code maintenance
● Allows validation logic in setter methods
🧱 Encapsulation Syntax in Java
class ClassName {
// Private data members
private dataType variableName;
// Public getter
public dataType getVariableName() {
return variableName;
}
// Public setter
public void setVariableName(dataType value) {
this.variableName = value;
}
}
📌 Real-life Example: Bank Account
class BankAccount {
// Data is hidden using private access modifier
private String accountHolderName;
private double balance;
// Public getter
public String getAccountHolderName() {
return accountHolderName;
}
// Public setter with validation
public void setAccountHolderName(String name) {
if (name != null && !name.isEmpty())
this.accountHolderName = name;
else
System.out.println("Invalid name");
}
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0)
this.balance += amount;
else
System.out.println("Invalid deposit amount");
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance)
this.balance -= amount;
else
System.out.println("Insufficient balance or invalid amount");
}
}
public class EncapsulationDemo {
public static void main(String[] args) {
BankAccount account = new BankAccount();
account.setAccountHolderName("Alice");
account.deposit(10000);
account.withdraw(2500);
System.out.println("Account Holder: " + account.getAccountHolderName());
System.out.println("Balance: ₹" + account.getBalance());
}
}
🔍 Output:
Account Holder: Alice
Balance: ₹7500.0
***************
P) Write a Java program to create a class of Rectangle that includes overloaded Constructor and
methods to calculate the Area of Square and Area of Rectangle.
Ans:
Java program that creates a Rectangle class, which includes:
1. Overloaded constructors to initialize a square or a rectangle.
2. Methods to calculate:
○ Area of a square
○ Area of a rectangle
class Rectangle {
// Instance variables
private double length;
private double width;
// Constructor to initialize a rectangle (with length and width)
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
// Overloaded constructor to initialize a square (same length and width)
public Rectangle(double side) {
this.length = side;
this.width = side;
}
// Method to calculate the area of the rectangle
public double areaRectangle() {
return length * width;
}
// Method to calculate the area of the square
public double areaSquare() {
return length * length; // Or use width * width (same for square)
}
// Getters for length and width
public double getLength() {
return length;
}
public double getWidth() {
return width;
}
}
public class RectangleTest {
public static void main(String[] args) {
// Creating a rectangle object
Rectangle rect = new Rectangle(5, 10);
System.out.println("Area of Rectangle: " + rect.areaRectangle());
// Creating a square object using the overloaded constructor
Rectangle square = new Rectangle(4);
System.out.println("Area of Square: " + square.areaSquare());
}
}
Output:
Area of Rectangle: 50.0
Area of Square: 16.0
📌 Explanation of Code:
1. Constructors:
○ The first constructor initializes a rectangle with a length and width.
○ The second constructor initializes a square where the length and width are the same
(overloaded constructor).
2. Methods:
○ areaRectangle() calculates the area of the rectangle using the formula length * width.
○ areaSquare() calculates the area of the square using length * length.
3. Main Method:
○ The RectangleTest class tests the Rectangle class by creating both a rectangle and a
square, and then printing the respective areas.
*******************
P) Describe Linked List and its type in detail.
Ans:
✅ Linked List Overview
A Linked List is a linear data structure where elements, called nodes, are stored in memory in a
non-contiguous manner. Each node contains two parts:
1. Data - The actual value or information.
2. Next - A reference (or link) to the next node in the sequence.
The main advantage of a linked list over arrays is that it allows dynamic memory allocation, meaning
the size can grow or shrink as needed without reallocating or resizing.
🔧 Basic Structure of a Linked List
java
CopyEdit
class Node {
int data; // Data part of the node
Node next; // Link to the next node
// Constructor
public Node(int data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
Node head; // The first node of the list
// Constructor to initialize empty list
public LinkedList() {
this.head = null;
}
// Method to add a new node at the end
public void addNode(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode; // If list is empty, new node becomes head
} else {
Node temp = head;
while (temp.next != null) {
temp = temp.next; // Traverse to the last node
}
temp.next = newNode; // Attach the new node
}
}
// Method to print the list
public void printList() {
Node temp = head;
while (temp != null) {
System.out.print(temp.data + " ");
temp = temp.next;
}
}
}
✅ Types of Linked Lists
1. Singly Linked List
○ Each node contains data and a reference to the next node.
○ Advantages: Simple structure, easy to implement, efficient in terms of memory for
small lists.
○ Disadvantages: You can only traverse the list in one direction (from head to tail).
○ Use Case: When you only need to move in a single direction (e.g., queues).
Example:
class SinglyLinkedList {
Node head;
public void addNode(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
}
}
public void printList() {
Node temp = head;
while (temp != null) {
System.out.print(temp.data + " ");
temp = temp.next;
}
}
}
2. Doubly Linked List
○ Each node contains a reference to both the next node and the previous node.
○ Advantages: Can be traversed in both directions (forward and backward).
○ Disadvantages: Requires more memory for storing two references per node.
○ Use Case: When you need to traverse the list in both directions (e.g., browser history,
undo operations).
Example:
class DoublyNode {
int data;
DoublyNode next;
DoublyNode prev;
public DoublyNode(int data) {
this.data = data;
this.next = null;
this.prev = null;
}
}
class DoublyLinkedList {
DoublyNode head;
public void addNode(int data) {
DoublyNode newNode = new DoublyNode(data);
if (head == null) {
head = newNode;
} else {
DoublyNode temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
newNode.prev = temp; // Linking the previous node
}
}
public void printList() {
DoublyNode temp = head;
while (temp != null) {
System.out.print(temp.data + " ");
temp = temp.next;
}
}
}
3. Circular Linked List
○ The last node’s next reference points back to the first node (forming a circle).
○ Types:
■ Singly Circular Linked List: Only the next pointer is circular.
■ Doubly Circular Linked List: Both next and prev pointers are circular.
○ Advantages: Can easily traverse the list starting from any node.
○ Disadvantages: Requires additional handling to break the cycle (e.g., during deletion).
○ Use Case: Implementing circular queues, round-robin scheduling, or multiplayer
games where the cycle must continue infinitely.
Example:
class CircularLinkedList {
Node head;
public void addNode(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
newNode.next = head; // Points back to itself, forming a circle
} else {
Node temp = head;
while (temp.next != head) {
temp = temp.next;
}
temp.next = newNode;
newNode.next = head; // Making it circular
}
}
public void printList() {
if (head != null) {
Node temp = head;
do {
System.out.print(temp.data + " ");
temp = temp.next;
} while (temp != head);
}
}
}
*****************
P) Explain stack with PUSH and POP operations.
Ans:
✅ Stack Overview
A Stack is a linear data structure that follows the Last In First Out (LIFO) principle, meaning the last
element added (pushed) to the stack is the first one to be removed (popped). It is like a stack of
plates, where you add (push) a plate on top and also remove (pop) the topmost plate first.
Basic Operations of Stack
1. Push: Adds an element to the top of the stack.
2. Pop: Removes the top element from the stack.
3. Peek/Top: Retrieves the top element without removing it.
4. isEmpty: Checks if the stack is empty.
5. Size: Returns the number of elements in the stack.
✅ Stack Structure
class Stack {
private int maxSize;
private int top;
private int[] stackArray;
// Constructor to initialize the stack
public Stack(int size) {
maxSize = size;
stackArray = new int[maxSize];
top = -1; // Stack is initially empty
}
// Push operation
public void push(int value) {
if (top < maxSize - 1) {
stackArray[++top] = value; // Increment top and add value
System.out.println("Pushed " + value + " to the stack.");
} else {
System.out.println("Stack Overflow: Unable to push, stack is full.");
}
}
// Pop operation
public int pop() {
if (top >= 0) {
int value = stackArray[top--]; // Return top value and decrement top
System.out.println("Popped " + value + " from the stack.");
return value;
} else {
System.out.println("Stack Underflow: Unable to pop, stack is empty.");
return -1;
}
}
// Peek operation (top element)
public int peek() {
if (top >= 0) {
return stackArray[top];
} else {
System.out.println("Stack is empty.");
return -1;
}
}
// Check if the stack is empty
public boolean isEmpty() {
return top == -1;
}
// Get the size of the stack
public int size() {
return top + 1;
}
}
public class StackDemo {
public static void main(String[] args) {
Stack stack = new Stack(5); // Create a stack of size 5
// Perform stack operations
stack.push(10);
stack.push(20);
stack.push(30);
stack.push(40);
stack.push(50);
stack.push(60); // Stack Overflow case
System.out.println("Top element: " + stack.peek()); // Display top element
stack.pop();
stack.pop();
System.out.println("Size of stack: " + stack.size()); // Check stack size
System.out.println("Top element: " + stack.peek());
}
}
🧾 Output:
Pushed 10 to the stack.
Pushed 20 to the stack.
Pushed 30 to the stack.
Pushed 40 to the stack.
Pushed 50 to the stack.
Stack Overflow: Unable to push, stack is full.
Top element: 50
Popped 50 from the stack.
Popped 40 from the stack.
Size of stack: 3
Top element: 30
✅ Explanation of Operations
1. Push Operation:
○ The push() method adds an element to the stack by first checking if there is space. If
the stack is not full, it increments the top pointer and places the element at that
position.
○ If the stack is full, it throws a "Stack Overflow" error.
2. Pop Operation:
○ The pop() method removes the top element from the stack by returning the value of
the current top element and then decrementing the top pointer.
○ If the stack is empty, it throws a "Stack Underflow" error.
3. Peek Operation:
○ The peek() method allows you to check the value of the top element without
removing it. If the stack is empty, it returns -1.
4. Size Operation:
○ The size() method returns the number of elements currently in the stack by simply
returning top + 1.
📌 Memory Layout
The stack in most programming languages is implemented using an array or a linked list:
● Array-Based Stack: As shown in the code, elements are stored in a contiguous block of
memory (array). top keeps track of the last element added. The stack grows or shrinks based
on top.
● Linked List-Based Stack: Each element (node) contains data and a reference to the next node.
The stack grows dynamically with no predefined size.
✅ Applications of Stack
● Undo/Redo operations in text editors.
● Expression evaluation (infix, postfix, prefix).
● Function call management (call stack).
● Depth-first search (DFS) in graphs.
● Balancing symbols (e.g., parenthesis in an expression).
*****************
P) Enlist Access Specifiers used in java and describe private accessspecifiers with real life
examples.
Ans:
✅ Access Specifiers in Java
Java provides four access specifiers (also known as access modifiers) that determine the visibility
and accessibility of classes, methods, and variables:
1. Public (public): The members (classes, methods, variables) are accessible from any other
class or package.
2. Private (private): The members are accessible only within the same class where they are
declared.
3. Protected (protected): The members are accessible within the same package and by
subclasses (even if they are in different packages).
4. Default (Package-Private): When no access specifier is specified, it is the default. The
members are accessible only within the same package.
✅ Private Access Specifier
The private access specifier in Java is used to restrict access to a member (variable, method, or
constructor) of a class so that it can only be accessed within the same class. This ensures that the
class's internal data is hidden from the outside world and cannot be directly modified or accessed
from outside the class.
🧑💻 Real-Life Example of Private Access Specifier
Imagine a Bank Account system where the bank account balance should not be directly modified by
external users for security reasons. Instead, we should control the access and modifications of the
balance through methods like deposit() and withdraw(). Here's how private access helps in this
scenario.
Example: Bank Account Class with Private Access Specifier
class BankAccount {
// Private field to store account balance
private double balance;
// Constructor to initialize the balance
public BankAccount(double initialBalance) {
if (initialBalance > 0) {
this.balance = initialBalance;
} else {
this.balance = 0;
System.out.println("Initial balance must be positive.");
}
}
// Public method to access the balance (getter)
public double getBalance() {
return this.balance;
}
// Public method to deposit money (set the balance)
public void deposit(double amount) {
if (amount > 0) {
this.balance += amount;
System.out.println("Deposited: $" + amount);
} else {
System.out.println("Deposit amount must be positive.");
}
}
// Public method to withdraw money (set the balance)
public void withdraw(double amount) {
if (amount > 0 && this.balance >= amount) {
this.balance -= amount;
System.out.println("Withdrew: $" + amount);
} else {
System.out.println("Insufficient balance or invalid amount.");
}
}
}
public class BankDemo {
public static void main(String[] args) {
// Create a BankAccount object with an initial balance of $1000
BankAccount account = new BankAccount(1000);
// Display the balance (using the getter method)
System.out.println("Current Balance: $" + account.getBalance());
// Deposit and withdraw money (using the public methods)
account.deposit(500);
account.withdraw(200);
// Final balance after transactions
System.out.println("Final Balance: $" + account.getBalance());
// The following line will cause an error because 'balance' is private
// System.out.println("Direct Balance Access: $" + account.balance); // Compile-time error!
}
}
🧾 Explanation of Code
● Private Variable:
○ private double balance; ensures that the balance cannot be directly accessed or
modified from outside the BankAccount class.
● Public Methods:
○ The methods deposit(), withdraw(), and getBalance() allow controlled access to the
balance. These methods perform validation before modifying or retrieving the
balance, ensuring that business logic is maintained.
● Encapsulation:
○ The use of the private access modifier in conjunction with public methods for
controlled access is a demonstration of encapsulation. It protects the data from direct
access and ensures that it can only be modified in controlled ways.
🚗 Real-Life Analogy: Bank Account
In a real-life bank scenario, consider a customer having a bank account. The bank account (like a
class) has a balance (like a private field), which is not directly accessible to the customer. If the
customer wants to know their balance or perform a transaction, they must interact with the bank's
system (like public methods), which ensures that the balance is correctly updated and verified
according to the rules (e.g., checking for sufficient funds, depositing correctly, etc.).
✅ Why Use Private Access Modifier?
● Security: It prevents unauthorized or unintended modifications of important data. For
example, the balance in a bank account should not be directly accessed or changed by
external systems or users, ensuring data integrity.
● Encapsulation: It hides the internal workings of the class and only exposes necessary
functionality through public methods, making the class easier to maintain and change.
● Control: By using getter and setter methods (or other public methods), you can implement
logic like validation or logging, which wouldn't be possible if the variables were directly
accessed.
****************
“Believe in yourself — you are capable of amazing things.”