Lessons available in both languages
Java Backend · Interview Prep

Object-Oriented Java interview questions & answers

201+ real Object-Oriented Java interview questions with model answers, plus free lessons to learn the concepts. Prepare in English & Hinglish, then practise with an AI mock interview.

17 topics · 201+ questions

Hirenix kaise padhata hai

Ek chapter. 90 minute.
Interview ke liye taiyaar.

Har concept ek real-world problem se — jaisa production code mein aata hai, waisa. Ratna nahi padta, samajh aa jaata hai. Har question ka model answer diya hai: interviewer ko exactly kya bolna hai, aur kyun. Phir usi chapter ka AI mock interview.

  • 📖Concept, 5 min meinJargon nahi — seedhi baat
  • 🛠️Real-world problemJaisa production code mein aata hai
  • 💬Model answerInterview mein kya bolna hai
  • 🧠FlashcardsRevision 10 min mein
  • 🤖AI mock interviewFollow-up bhi poochta hai
  • 📊Weak topicsKahan phans rahe ho, pata chale
Ye chapter shuru karo — free🌐 English🇮🇳 Hinglish
A student learning an interview concept on Hirenix at home
Video playlistsyllabus ke hisaab se18h+
Hirenix chapterinterview ke hisaab se90 min

Farq content ka nahi, filter ka hai — sirf wahi jo production mein actually use hota hai aur interview mein actually poocha jaata hai. Kitaabi topics jo industry mein kahin nahi chalte, wo yahan nahi milenge.

Lessons available in both languages

What you’ll learn

  • Classes aur objects
  • Constructors
  • Encapsulation aur access modifiersFree account
  • Inheritance aur superFree account
  • Polymorphism: overloading vs overridingFree account
  • Static vs dynamic bindingFree account
  • Abstraction aur abstract classesFree account
  • InterfacesFree account
  • Abstract class vs interfaceFree account
  • Object class: equals, hashCode, toStringFree account
  • Casting aur instanceofFree account
  • Composition vs inheritanceFree account
  • Immutable class design karnaFree account
  • RecapFree account
  • Project: Library System
  • Project: Shape CalculatorFree account
  • Project: Bank Account HierarchyFree account

Classes aur objects

Builder aapko drawing nahi bechta. Wo aapko flat bechta hai. Par pehla flat banne se pehle kisi ne ek plan banaya tha — teen bedroom yahan, kitchen wahan, balcony itni chaudi. Usi ek plan se phir chalis flat bane. Har flat ka layout same hai, aur har flat ka apna furniture, apna bijli ka bill, apna parivaar jo usme rehta hai.

Plan ek class hai. Har flat ek object hai. Aap plan me reh nahi sakte, aur sofa hilaakar poori building ka naksha badal nahi sakte.

Production me har asli system isi shape me bana hota hai. Hirenix me ek Resume class hai aur karib nabbe hazaar resume object. Ek Payment class, aur har transaction ka ek payment object. Class ek baar likhna hi wo cheez hai jo aapko wahi logic nabbe hazaar baar likhne se bachati hai.

🌍 Real-world example: aapke phone ka WhatsApp app ek tarah ki cheez hai; uske andar har chat ek object hai jiska apna naam, apni message list aur apna unread count hai. App ka design ek baar badlo, har chat me aa jaata hai. Ek chat ka naam badlo, sirf wahi chat badalti hai.

💡 class = ek blueprint jo batata hai ki object kya state rakhega aur kya kar sakta hai. 💡 object = us blueprint se bani ek asli cheez, jiske paas state ki apni copy hoti hai. 💡 instance = object ka doosra naam. "Instantiate" karna = object banana. 💡 field (yaani instance variable) = wo variable jo har object ka apna hota hai. 💡 method = class ka function jo object ke fields dekh sakta hai. 💡 this = us object ka reference jis par method us waqt kaam kar raha hai.

Class kis-kis cheez se banti hai

hissa kiska hai misaal
field har object ka String name;
method class ka, chalta ek object par void introduce() { ... }
constructor new par ek baar chalta hai Student(String name, int roll)
static member class ka khud ka, ek hi copy static int totalCreated; (Chapter 1)

new asal me kya karta hai — teen step, isi order me

Chapter 1 me padha tha ki objects heap par rehte hain aur references stack par. new Student("Waquar", 101) wahi baat dikhata hai:

  1. Student ke liye heap par jagah milti hai, aur uske fields default par set hote hain — name ke liye null, roll ke liye 0.
  2. Constructor chalta hai aur un fields ko bharta hai.
  3. Us heap object ka address wapas milta hai, aur aap usko ek reference variable me rakh lete hain.

Matlab Student a khud student nahi hai. Wo student ki taraf ishaara karta hua ek arrow hai. Yahi ek baat agle output ki poori wajah hai:

a.name after changing c.name = Waquar Ahmed
a == c -> true   |   a == b -> false
d = null

Student c = a; ne object copy nahi kiya. Usne arrow copy kiya, to ab do variable ek hi heap object ki taraf ishaara kar rahe hain, aur c se kiya gaya badlav a me bhi dikhta hai. a == c true hai kyunki dono arrow me wahi address hai; a == b false hai chahe saare field match kar jaayein, kyunki == address compare karta hai (Chapter 1). Aur d aisa reference hai jo kisi bhi object ki taraf ishaara nahi karta — print karne par null aata hai, aur usi par method call karne se NullPointerException aata hai.

Har object ke liye new zaroori nahi

Ek aam interview sawaal hai — "kya object banane ka sirf new hi tareeka hai?" — aur imaandaar jawab hai: nahi. Verified:

  "hello"          -> java.lang.String
  Integer.valueOf  -> java.lang.Integer
  reflection       -> Reflected

Ek String literal pehle se hi object hai, jo JVM aapke liye String pool se banata hai (Chapter 1). Integer.valueOf(7) ek static factory method hai — wo aapko object deta hai aur naya banane ki jagah cached object dobara de sakta hai, aur isi wajah se −128..127 wala Integer cache maujood hai. Aur reflection (getDeclaredConstructor(...).newInstance(...)) runtime par class object se object banata hai; Spring jaise framework aapke objects isi tareeke se banate hain, jo Chapter 7 ke liye yaad rakhne layak hai. Deserialisation aur clone() do aur tareeke hain. new normal raasta hai, sirf raasta nahi.

Kab use karein: class tab banaiye jab kisi cheez ke paas apni state ho aur us state par kaam karne wala behaviour ho — Student ke paas naam aur roll number hai aur wo apna introduce kar sakta hai. Yahi test hai. Chapter 1 ne aapko doosra option diya tha: ek static utility method, jo sirf apne arguments par chalta hai aur kuch rakhta nahi. Math.max(a, b) ko object ki zaroorat nahi kyunki "max" koi cheez hi nahi hai; calculateGrade(marks) static helper ke roop me theek hai. Jis din aap paayein ki wahi teen value har method me saath-saath ja rahi hain, samajh lijiye wo teen value ek object banne ka intezaar kar rahi hain.

Kab NAHI use karein: aisi class na banaiye jiska kaam sirf static methods rakhna ho aur state kuch bhi na ho — wo utility holder hai, Java me ye pattern hota hai, par usko object-oriented design kehna khud ko dhoka dena hai. Isi tarah, jahan ek value kaafi ho wahan object na banaiye: ek int ko lapetne wali class, jiske paas koi behaviour nahi, bina wajah ek heap allocation aur ek extra layer jodti hai. Aur kisi cheez ko class isliye na banaiye ki requirement me wo ek noun hai; class isliye banaiye ki aapke code me kisi ko uski state rakhni hai aur usse sawaal poochhne hain.

Standard definition (interview me bolo): A class is a blueprint that defines the fields and methods its objects will have; an object is a runtime instance of that class with its own copy of the instance fields. The new operator allocates the object on the heap, initialises its fields to their defaults, runs the constructor, and returns a reference to it. A reference variable holds the address of the object, not the object itself, so assigning one reference to another creates a second arrow to the same object rather than a copy.

public class Student {
    String name;                 // instance field - one copy per object
    int roll;
    static int totalCreated;     // one copy for the whole class (Ch1)

    Student(String name, int roll) {
        this.name = name;        // this = the object the constructor is building
        this.roll = roll;
        totalCreated++;
    }

    void introduce() {
        System.out.println("I am " + name + ", roll " + roll);
    }

    public static void main(String[] args) throws Exception {
        Student a = new Student("Waquar", 101);
        Student b = new Student("Aisha", 102);
        a.introduce();
        b.introduce();
        System.out.println("objects created = " + Student.totalCreated);

        Student c = a;                       // a SECOND reference to the SAME object
        c.name = "Waquar Ahmed";
        System.out.println("a.name after changing c.name = " + a.name);
        System.out.println("a == c -> " + (a == c) + "   |   a == b -> " + (a == b));

        Student d = null;                    // a reference pointing at no object
        System.out.println("d = " + d);

        System.out.println("objects that exist without new:");
        System.out.println("  \"hello\"          -> " + "hello".getClass().getName());
        System.out.println("  Integer.valueOf  -> " + Integer.valueOf(7).getClass().getName());
        System.out.println("  reflection       -> "
            + Student.class.getDeclaredConstructor(String.class, int.class)
                    .newInstance("Reflected", 103).name);
        System.out.println("objects created = " + Student.totalCreated);
    }
}

Constructors

Jab ek naya SIM card activate hota hai, wo bas aapke haath me aakar chalne nahi lagta. Ek switch-on step hota hai: number assign hota hai, plan lagta hai, balance zero set hota hai, KYC stamp hoti hai. Uske baad hi wo istemaal layak SIM banta hai. Us step se pehle koi usko use nahi kar sakta, aur wo step theek ek baar chalta hai — SIM do baar activate nahi hota.

Constructor object ka wahi activation step hai. new memory laata hai; constructor us memory ko ek valid object bana deta hai.

Production me ye correctness ka aujaar hai, suvidha ka nahi. Hirenix ka payment object kabhi null amount ke saath maujood nahi hona chahiye, kyunki aage koi line usko total me jodegi. Jo constructor amount maangta hai wo toote hue object ko banana hi namumkin kar deta hai, aur ye "baad me set karna yaad rakhna" se bahut mazboot guarantee hai.

🌍 Real-world example: bank pehle account nahi kholta aur phir aapka naam nahi poochhta. Form hi constructor hai — na naam, na PAN, na account. Account aadhe-bhare haal me maujood ho hi nahi sakta.

💡 constructor = ek khaas block jo object banne par ek baar chalta hai, usko initialise karne ke liye. 💡 default constructor = wo no-argument constructor jo compiler aapke liye likhta hai, jab aap ek bhi nahi likhte. 💡 constructor overloading = ek class me kai constructor, jinke parameters alag hain. 💡 constructor chaining = ek constructor doosre ko bulaana, this(...) ya super(...) se. 💡 instance initializer block = { ... } bina static, har new par constructor body se pehle chalta hai.

Constructor vs method — teen farak, aur beech wala hi trap hai

constructor method
naam bilkul class ka naam hona chahiye kuch bhi
return type bilkul hota hi nahivoid bhi nahi hona zaroori hai
call ek baar, new dwaara jitni baar chaahein, aap dwaara

Doosri row par candidates sawaal haar jaate hain. void Student() { ... } likhiye aur ye poori tarah compile ho jaayega — par ab ye ek saadha method hai jiska naam sanyog se Student hai, to new Student() usko kabhi call nahi karta aur aapke fields null reh jaate hain. Aage void lagana constructor ko chupchaap method bana deta hai. Na warning, na error.

Default constructor: rule ka wo aadha hissa jo sab bhool jaate hain

Agar aap ek bhi constructor nahi likhte, compiler aapke liye ek public no-argument constructor daal deta hai. Isi liye jis class ko aapne koi constructor diya hi nahi, us par new Student() chalta hai.

Jis pal aap koi bhi constructor likh dete hain, wo tohfa wapas le liya jaata hai. Verified:

NoDefaultCtor.java:6: error: constructor Student in class Student cannot be applied to given types;
    public static void main(String[] a) { Student s = new Student(); System.out.println(s); }
                                                      ^
  required: String
  found:    no arguments
  reason: actual and formal argument lists differ in length

Asli duniya me ye aise dikhta hai: chalta hua code us din toot jaata hai jab koi us class me parameterised constructor jodta hai jisko doosra code new Student() se bana raha tha. Dono chahiye to dono likhiye — no-arg wala apne aap wapas nahi aata.

Overloading aur chaining — logic ek baar likhiye

Kai constructor rakhna theek hai; unka parameter list alag hona chahiye. Par teen constructor jo wahi teen field set karein, matlab ek hi bug ke liye teen jagah — to unme se ek asli kaam karta hai aur baaki usko this(...) se delegate karte hain:

--- new Employee() ---
[instance block] runs on every new, before the constructor body
  Employee(String,String,int) built Unknown
  Employee() body ran last

Order dhyaan se padhiye. Employee() ne apni pehli line par this("Unknown", "Bench", 0) call kiya, to teen-argument wala constructor Employee() ki apni body chhapne se pehle khatam ho gaya. Delegation pehle hota hai, hamesha.

this() aur super() dono kyun nahi likh sakte

Dono ko constructor ki pehli statement hona zaroori hai, aur do statement dono pehli nahi ho sakti. Poora jawab yahi hai, aur compiler bilkul yahi kehta hai:

ThisSuperBoth.java:5: error: call to this must be first statement in constructor
        this(5);
            ^

Ye yaad karne wali paabandi nahi hai — ye us rule se nikalta hai ki child kuch bhi chhune se pehle parent poori tarah ban jaana chahiye. this(...) wo kaam us constructor ko de deta hai jisko wo delegate karta hai, aur wo khud super(...) se shuru hoga.

Constructor kya nahi ho sakta

modifier allowed? kyun
private / protected / public ✅ haan private constructor se Singleton aur static factory bante hain (Chapter 1 ke static topic ne mechanism dikhaya tha)
static error: modifier static not allowed here static ka matlab "koi object shaamil nahi" — par constructor ka poora kaam object initialise karna hai
final error: modifier final not allowed here final ka matlab "override nahi ho sakta", aur constructor inherit hote hi nahi, to override kabhi hote hi nahi
abstract abstract ka matlab "body subclass degi" — wahi wajah

Oopar ke dono error message JDK 17 se verbatim hain.

Poora initialization order — Chapter 1 ka static block, poora hota hua

Chapter 1 ne static block ko main se pehle chalte dikhaya tha. Inheritance ke saath poora sequence ye hai, verified:

--- new Child() #1 ---
1 Parent static block
2 Child static block
3 Parent instance block
4 Parent constructor
5 Child instance block
6 Child constructor
--- new Child() #2 (static blocks should NOT repeat) ---
3 Parent instance block
4 Parent constructor
5 Child instance block
6 Child constructor

Isse teen baatein lijiye. Pehli, order ye nahi hai ki "parent poora, phir child poora" — dono class ke static block kisi bhi instance kaam se pehle chalte hain, kyunki wo class loading hai, jo ek baar hoti hai. Doosri, har object ke liye parent ka instance block aur constructor child ke shuru hone se pehle poore hote hain. Teesri, doosra new sabit karta hai ki static block dohraate nahi, jabki baaki sab dohraata hai.

Employee ke run me ek aur cheez verified hui: instance block har object par ek baar chhapa, na ki har constructor call par, jabki har object ke liye do constructor chale. Wo new se juda hai, constructor se nahi.

Kab use karein: explicit constructor tab likhiye jab object ke paas aisa field ho jo kabhi gayab nahi hona chahiye — ek id, ek amount, ek owner. Usko constructor parameter bana dena "kisi ne set karna bhool gaya" ko runtime bug se compile error bana deta hai, aur ye guarantee ka sabse mazboot roop hai. Overloading plus this(...) delegation tab use kijiye jab waaqai kuch alag-alag set ki jaankari caller ke paas ho sakti ho, aur asli assignment karne wala theek ek constructor rakhiye. private constructor tab, jab class ko khule aam banaya na jaana chahiye — ek utility holder, ya Integer.valueOf jaisi static factory.

Kab NAHI use karein: chhah-saat parameter wala constructor na likhiye — call site par new Resume(a, b, true, false, null, 3, "") koi padh hi nahi sakta, aur do boolean saath me bug ka intezaar hain. Wahan matlab wale naam wali static factory (Resume.blank(), Resume.fromPdf(file)) ya builder faaydemand ho jaata hai. Constructor me slow ya risky kaam na daaliye — network call, file read, database query — kyunki uske chalte waqt object aadha bana hua hai aur failure batane ka koi accha tareeka nahi hai. Sasta construct kijiye, phir alag se load() call kijiye. Aur sirf rakhne ke liye khaali no-arg constructor na likhiye; agar aap koi constructor nahi likhte, compiler pehle se hi wahi de raha hai.

Standard definition (interview me bolo): A constructor is a special block with the same name as its class and no return type, invoked once by new to initialise a newly allocated object. If a class declares no constructor the compiler supplies a public no-argument default constructor, and that default disappears as soon as any constructor is declared. Constructors can be overloaded and can delegate with this(...) or invoke the superclass constructor with super(...), but only one of those may appear and it must be the first statement. A constructor cannot be static, final or abstract. On object creation, static initialisers run once at class loading, then for each object the instance initialiser blocks and constructors run from the superclass downwards.

public class Employee {
    static int hired;
    String name;
    String dept;
    int salary;

    static { System.out.println("[static block] class loaded, hired=" + hired); }

    { System.out.println("[instance block] runs on every new, before the constructor body"); }

    Employee() {                                  // no-arg
        this("Unknown", "Bench", 0);              // this() = call another constructor, FIRST line
        System.out.println("  Employee() body ran last");
    }

    Employee(String name) {                       // overload
        this(name, "Bench", 25000);
    }

    Employee(String name, String dept, int salary) {   // the real one
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        hired++;
        System.out.println("  Employee(String,String,int) built " + name);
    }

    public static void main(String[] args) {
        System.out.println("--- new Employee() ---");
        Employee a = new Employee();
        System.out.println("--- new Employee(\"Waquar\") ---");
        Employee b = new Employee("Waquar");
        System.out.println("a = " + a.name + "/" + a.dept + "/" + a.salary);
        System.out.println("b = " + b.name + "/" + b.dept + "/" + b.salary);
        System.out.println("hired = " + hired + "   (4 constructor calls, 2 objects, 2 counter bumps)");
    }
}

Project: Library System

Ye chapter ka entry project hai, aur ye jaan-boojh kar sirf pehle teen topics use karta hai — classes aur objects, constructors, encapsulation. Koi inheritance nahi, koi interface nahi, koi abstract class nahi. Agar aapne wo teen topics padh liye hain, to aap ise poora kar sakte hain, aur aakhir me aapne India ka sabse aam OOP interview task likh liya hoga: "library system design kijiye".

Aap kya banayenge: do classes — ek Book jisko galat haalat me daala hi na ja sake, aur ek Library jo books rakhti hai aur unko dhoondh sakti hai. Wo command line se chalta hai aur ek saja hua report chhaapta hai.

Ye project kya sabit karta hai: state aur usko bachaane wale rules ek hi class me rakhna, constructor ko rasm ki jagah ek gate ki tarah use karna, aur HAS-A ko extends ki jagah ek field se batana.


Step 1 — Tay kijiye ki class kya hai, aur har ek ke paas kya hai

Type karne se pehle classes-and-objects topic ka sawaal jawab dijiye: kiske paas apni state hai?

  • Ek book ke paas ISBN, title, author, copies ki ginti, aur kitni abhi bahar hain — ye hai. Wo borrow aur return ho sakti hai. → ek class.
  • Ek library ke paas naam aur books ka ek zakheera hai. Wo add aur find kar sakti hai. → ek class.
  • Ek borrower? Is project me nahi. Usko jodne ke liye doosra zakheera aur ek rishta chahiye, aur wo capstone project ka hai.

Dhyaan dijiye yahan kya nahi ho raha: Library kuch bhi extend nahi karti, aur Library Book nahi hai. Library ke paas books hain, to books ek field me rehti hain. Ye IS-A / HAS-A test ek line likhne se pehle lagaya gaya hai.

Step 2 — Book likhiye, aur galat book ko namumkin bana dijiye

private final String isbn;      // identity - set once, never changes
private final String title;
private int totalCopies;
private int borrowedCopies;

Do faisle dhyaan dene layak:

  • isbn aur title final hain. Wo pehchaan hain, construction par set hote hain, aur unko baad me badalne ki koi jaayaz wajah nahi hai. Ye setter-rahit getter se mazboot hai — compiler isko lagoo karta hai.
  • borrowedCopies constructor ke parameter list me nahi hai. Ek nayi book ki koi copy bahar nahi hoti, to constructor usko khud 0 set karta hai. Jo value object khud nikaal sakta hai, uske liye parameter na leejiye.

Phir constructor validate karta hai:

if (isbn == null || isbn.isBlank())   throw new IllegalArgumentException("isbn required");
if (totalCopies < 1) throw new IllegalArgumentException("need at least 1 copy");

constructors topic ki poori baat yahi hai. Khaali ISBN ya zero copies wali Book ban hi nahi sakti, to baad ke kisi code ko uske liye check karna hi nahi padta. Verified:

rejected: isbn required
rejected: need at least 1 copy

Step 3 — Operations dikhaiye, fields nahi

Lubhaane wala API getBorrowedCopies() aur setBorrowedCopies(int) hai. Usko na likhiye. Farak ye hai:

API rule kaun lagoo karta hai
setBorrowedCopies(n) har caller, alag-alag, hamesha
boolean lautaane wala borrow() Book, ek baar

To Book theek do badalne wale method dikhata hai, aur dono jab zaroori ho tab mana karte hain:

boolean borrow() {
    if (available() <= 0) return false;
    borrowedCopies++;
    return true;
}

Aur available() ek derived value hai — totalCopies - borrowedCopies — zaroorat par nikaali gayi, rakhi hui nahi. Derived value ki rakhi hui copy sach ka doosra zariya hai, aur dono ek din alag ho jaayenge.

Verified, us book par jiski theek ek copy hai:

borrow Head First Java  -> true
borrow it again         -> false   (only 1 copy)
return it               -> true
return it again         -> false   (nothing is out)

Chaaron soorat theek chalti hain, us wali samet jo log bhool jaate hain: wo book return karna jo kisi ne borrow hi nahi ki. Us check ke bina borrowedCopies negative chala jaata aur available() library ke paas maujood copies se zyada bata deta.

💡 boolean kyun aur exception kyun nahi? Borrow na ho paana ek aam nateeja hai, bug nahi — book bas bahar hai. Exceptions Chapter 4 hain; filhaal, ummeed ki gayi failure ke liye boolean lautaiye aur sirf programmer ki galti par throw kijiye, jo constructor karta hai.

Step 4 — Library likhiye, books ek field me rakhte hue

private final String name;
private final Book[] shelf;      // fixed-size store
private int count;

Ek array, ArrayList nahi — collections Chapter 3 hain, aur Chapter 1 ke arrays yahan kaafi hain. count batata hai ki kitne khaane waaqai bhare hain, kyunki shelf.length capacity hai, andar rakha samaan nahi.

addBook wo do rules lagoo karta hai jo library ke hain, book ke nahi:

if (count == shelf.length) return false;              // shelf full
if (findByIsbn(b.getIsbn()) != null) return false;    // duplicate ISBN

Dhyaan dijiye duplicate ka rule kahan rehta hai. Ek Book jaan hi nahi sakti ki uske ISBN wali doosri book maujood hai ya nahi — sirf Library jaan sakti hai. Har rule ko us class me rakhna jiske paas usko jaanchne ki jaankari hai — amal me encapsulation ka matlab yahi hai. Verified:

duplicate ISBN accepted? false

Step 5 — Search kijiye, aur tay kijiye "na mila" kaisa dikhta hai

Book findByIsbn(String isbn) {
    for (int i = 0; i < count; i++) {
        if (shelf[i].getIsbn().equals(isbn)) return shelf[i];
    }
    return null;
}

Do baatein:

  • .equals(isbn), == nahi. Chapter 1 ka sabak, aur is project ki pehli jagah jahan galti kuch inputs par chupchaap fail hoti aur kuch par chalti dikhti.
  • Na milne par null lautaiye, aur caller check kare. Verified: findByIsbn("999") = null — koi crash nahi. (Java ka behtar jawab Optional hai, jo Chapter 5 hai.)

Step 6 — Aisa report chhaapiye jo insaan padh sake

return String.format("%-14s %-26s %-18s %2d/%2d",
    isbn, title, author, available(), totalCopies);

%-14s 14 character me baayein taraf lagata hai, %2d number ko 2 me daayein. Isi se column seedhe hote hain:

=== Hirenix Community Library (3 titles) ===
ISBN           TITLE                      AUTHOR             AVAIL
978-81-001     Let Us Java                Y. Kanetkar         2/ 2
978-81-002     Head First Java            K. Sierra           1/ 1
978-81-003     Effective Java             J. Bloch            3/ 3

Dhyaan dijiye ki run ke aakhir me doosra report() teenon books ko poori availability par dikhata hai — borrow aur return barabar ho gaye, aur ye chupchaap ka proof hai ki state ke badlaav sahi the.


Chalaiye

$ javac LibraryApp.java
$ java LibraryApp

Aage badhana ho to kya jodein

Inme se har ek sirf wahi use karta hai jo aap pehle se jaante hain:

  1. findByAuthor(String) jo ek ginti lautaye, taaki aap bina collection loop ki mashq karein.
  2. Ek Member class jiske paas naam aur borrow limit ho, aur usko borrow(Member m) me bhejein. Wo doosri class aur ek rishta hai — aur capstone project isi shape par bana hai.
  3. Library par ek totalCopiesInLibrary() jo shelf par jod de.
  4. Array ki jagah ArrayList Chapter 3 ke baad rakhiye, aur dekhiye ki Library ke public methods bilkul nahi badalte. Wahi encapsulation aapko wapas de raha hai.

Ye project aapko kaun sa interview jawab deta hai

Jab "library system design kijiye" poochha jaaye, classes ginaana shuru na kijiye. Ye kahiye:

"Do classes. Book apni state ki maalik hai — ISBN aur title final hain kyunki wo pehchaan hain, aur copy count badalne ke sirf do tareeke borrow() aur giveBack() hain, jo dono zaroorat par mana karte hain, to count kabhi negative nahi ja sakta. Constructor validate karta hai, to khaali ISBN ya zero copies wali book ban hi nahi sakti. Library books ki maalik hai unme se ek nahi, aur wo wo rules rakhti hai jo sirf wo jaanch sakti hai — duplicate ISBN, aur bhara hua shelf. Na milne par filhaal null aata hai; Optional behtar hota."

Wo jawab encapsulation, constructor validation, HAS-A, derived state aur ek soch-samajh kar bana API dikhata hai — us project se jo bees minute me likha ja sakta hai.

public class LibraryApp {

    // ---------- Book: one class, fully encapsulated ----------
    static class Book {
        private final String isbn;          // identity - set once, never changes
        private final String title;
        private final String author;
        private int totalCopies;
        private int borrowedCopies;

        Book(String isbn, String title, String author, int totalCopies) {
            if (isbn == null || isbn.isBlank())   throw new IllegalArgumentException("isbn required");
            if (title == null || title.isBlank()) throw new IllegalArgumentException("title required");
            if (totalCopies < 1) throw new IllegalArgumentException("need at least 1 copy");
            this.isbn = isbn;
            this.title = title;
            this.author = author;
            this.totalCopies = totalCopies;
            this.borrowedCopies = 0;
        }

        // read-only: getters, no setters
        String getIsbn()   { return isbn; }
        String getTitle()  { return title; }
        String getAuthor() { return author; }
        int available()    { return totalCopies - borrowedCopies; }

        // the ONLY two ways state can change, and both check first
        boolean borrow() {
            if (available() <= 0) return false;
            borrowedCopies++;
            return true;
        }
        boolean giveBack() {
            if (borrowedCopies == 0) return false;   // nobody borrowed it
            borrowedCopies--;
            return true;
        }

        String line() {
            return String.format("%-14s %-26s %-18s %2d/%2d",
                isbn, title, author, available(), totalCopies);
        }
    }

    // ---------- Library: holds Books (HAS-A) ----------
    static class Library {
        private final String name;
        private final Book[] shelf;          // fixed-size store (Ch1 arrays)
        private int count;

        Library(String name, int capacity) {
            this.name = name;
            this.shelf = new Book[capacity];
        }

        boolean addBook(Book b) {
            if (count == shelf.length) return false;
            if (findByIsbn(b.getIsbn()) != null) return false;   // no duplicate ISBN
            shelf[count++] = b;
            return true;
        }

        Book findByIsbn(String isbn) {
            for (int i = 0; i < count; i++) {
                if (shelf[i].getIsbn().equals(isbn)) return shelf[i];
            }
            return null;
        }

        void report() {
            System.out.println("=== " + name + " (" + count + " titles) ===");
            System.out.println(String.format("%-14s %-26s %-18s %s", "ISBN", "TITLE", "AUTHOR", "AVAIL"));
            for (int i = 0; i < count; i++) System.out.println(shelf[i].line());
        }
    }

    public static void main(String[] args) {
        Library lib = new Library("Hirenix Community Library", 5);

        lib.addBook(new Book("978-81-001", "Let Us Java",       "Y. Kanetkar", 2));
        lib.addBook(new Book("978-81-002", "Head First Java",   "K. Sierra",   1));
        lib.addBook(new Book("978-81-003", "Effective Java",    "J. Bloch",    3));
        boolean dup = lib.addBook(new Book("978-81-001", "Let Us Java (2nd)", "Y. Kanetkar", 1));
        System.out.println("duplicate ISBN accepted? " + dup);

        lib.report();

        System.out.println("--- borrowing ---");
        Book hf = lib.findByIsbn("978-81-002");
        System.out.println("borrow Head First Java  -> " + hf.borrow());
        System.out.println("borrow it again         -> " + hf.borrow() + "   (only 1 copy)");
        System.out.println("return it               -> " + hf.giveBack());
        System.out.println("return it again         -> " + hf.giveBack() + "   (nothing is out)");

        System.out.println("--- the constructor refuses a broken Book ---");
        try {
            new Book("", "No ISBN", "Nobody", 1);
        } catch (IllegalArgumentException e) {
            System.out.println("rejected: " + e.getMessage());
        }
        try {
            new Book("978-81-004", "Zero Copies", "Nobody", 0);
        } catch (IllegalArgumentException e) {
            System.out.println("rejected: " + e.getMessage());
        }

        System.out.println("--- a missing book is null, not a crash ---");
        System.out.println("findByIsbn(\"999\") = " + lib.findByIsbn("999"));

        lib.report();
    }
}

Object-Oriented Javainterview questions & answers

10 sample questions below — 201+ in the full bank inside.

Abstract class vs interface ka ek line wala jawab dijiye.

Abstract class batati hai cheez KYA HAI aur wo theek ek milti hai; interface batata hai cheez KYA KAR SAKTI HAI aur wo jitne chaahein. Baaki sab — state, constructor, final methods — usi se nikalta hai.

In simple terms: Khaandaan vs membership. Jaise agar aap farak ek jumle me keh sakein aur phir Java 8 ke baad bache teen farak ki wajah bata sakein, to aapne chapter ka signature sawaal poora jawab de diya.

Abstract class kya hai, aur uska object kyun nahi ban sakta?

Abstract class abstract keyword se declare hoti hai aur wo seedha istemaal hone ki jagah extend hone ke liye hai. Uska object nahi ban sakta kyunki usme abstract methods ho sakte hain — bina body wale signature — to new Shape() aapko aisa object deta jispar area() call ho sakta aur chalane ke liye koi code nahi. javac kehta hai: Shape is abstract; cannot be instantiated.

In simple terms: Exam answer sheet ka cover page chhapa hota hai aur answer pages khaali; board usko poora hua paper maan kar jama nahi kar sakta. Jaise ye ooper se lagayi hui safety nahi hai — chhoote hue methods ke liye waaqai chalane layak kuch nahi hai.

Abstract class aur interface saath use kar sakte hain? Wo koi samjhauta hai?

Kar sakte hain, aur wo samjhaute ki jagah standard shape hai. Interface public contract batata hai aur abstract class un hisson ko implement karti hai jo saanjhe hain, baaki subclasses par chhod kar. JDK Collection aur AbstractCollection ke saath theek yahi karta hai.

In simple terms: Ek rulebook plus ek starter kit jo aam soorat pehle se sambhaal leta hai. Jaise abstract class Shape implements Drawable interface ke default se label() poora kar deti hai aur asciiArt() apne bachchon ko de deti hai, apne abstract area() ke saath.

Compiler aapko default constructor kab deta hai?

Sirf tab jab class ek bhi constructor declare nahi karti. Compiler tab ek public no-argument constructor daal deta hai jiski body sirf super() call karti hai. Jis pal aap koi bhi constructor likhte hain — parameterised bhi — wo tohfa wapas le liya jaata hai aur new Student() compile hona band kar deta hai.

In simple terms: Hotel aapko standard kamra tabhi deta hai jab aapne kuch bataya na ho. Jis pal aap pasand batate hain, aapko theek wahi milta hai jo maanga, aur kuch nahi. Jaise chalti hui class me Student(String name) jodna har maujooda new Student() call site ko tod deta hai.

OOP me abstraction kya hai?

Abstraction ka matlab hai ye dikhana ki object kya karta hai aur ye chhupana ki kaise karta hai. Caller ko poori asliyat se chhota contract diya jaata hai, to wo cheez ka istemaal mechanism jaane bina kar sakta hai — aur mechanism usko chhue bina badla ja sakta hai. Java me ye abstract classes aur interfaces se hasil hota hai.

In simple terms: Aap accelerator dabate hain aur aapko bataya hi nahi jaata ki car petrol hai ya electric. Jaise receipt() method wala Payment reference rakhne wale caller ko kabhi pata nahi chalta ki paisa UPI se gaya ya card se.

Abstract class aur interface me kya farak hai?

Abstract class batati hai cheez KYA HAI aur aap sirf ek extend kar sakte hain; interface batata hai cheez KYA KAR SAKTI HAI aur aap jitne chaahein implement kar sakte hain. Abstract class instance fields, ek constructor, kisi bhi access level ke members aur final methods rakh sakti hai. Interface sirf public static final constants rakhta hai, uska constructor nahi hota aur har-object state nahi hoti.

In simple terms: Aap ek khaandaan ke hote hain aur kai membership rakhte hain. Khaandaan ne aapko surname aur ek itihaas diya; gym card sirf access deta hai. Jaise Manager extends Employee implements Printable, Auditable ek khaandaan aur do membership hai, ek hi line me.

Kisi field ko padhne layak par bahar se kabhi na badalne layak kaise banayein?

Usko getter dijiye aur setter nahi, aur usko private final likhiye taaki construction ke baad class khud bhi usko dobara assign na kar sake. Usko constructor me set kijiye. Public field ye farak keh hi nahi sakta — wo padhne aur likhne dono layak hota hai ya kuch bhi nahi.

In simple terms: Aapki janm-taareekh aapke ID par chhapi hoti hai jisko koi bhi padh sakta hai aur badal koi nahi sakta. Jaise private final String holder ke saath getHolder() ho aur setHolder() na ho, to holder object ki poori umr dikhta hai aur kabhi badalta nahi.

Koi class abstract aur final dono ho sakti hai?

Nahi. abstract ka matlab hai usko extend hona hi chahiye aur final ka matlab hai wo extend nahi ho sakti, to dono kat jaate hain aur javac kehta hai illegal combination of modifiers: abstract and final. Agar aap instantiation aur subclassing dono rokna chahte hain, to private constructor wali final class use kijiye.

In simple terms: Ek hi darwaze par "istemaal zaroori hai" aur "hamesha ke liye seal" dono likha ho. Jaise utility holder ke liye final class Utils aur private Utils() {} ye baat theek kehta hai, aur kisi ko extend karne ki koshish ka nyota nahi deta.

Default toString() kya lautata hai, aur usko override kyun karna chahiye?

Class ka naam, phir @, phir hexadecimal me hash code — jaise java.lang.Object@3fee733d. Hex ka hissa har run me badalta hai, to kisi khaas value ko pakka na maaniye. Override isliye kijiye ki ek method class ki poori umr ke liye har log line, debugger view aur println badal deta hai.

In simple terms: Jis parcel par sirf barcode hai wo sorter ko kuch kaam ki baat nahi batata. Jaise Full[roll=101, name=Waquar] padha ja sakta hai aur Full@452b3a41 nahi, aur raat do baje production log me aap doosre ko hi dekh rahe honge.

Abstract method kya hai?

Wo method jiska signature ho aur body ki jagah semicolon — abstract double area();. Wo ye elaan karta hai ki har concrete subclass ko implementation dena hoga. Jo bhi concrete class nahi deti usko mana kar diya jaata hai: is not abstract and does not override abstract method area().

In simple terms: Form par "zaroori" likha khaali khaana — jab tak koi usko bhare nahi, form jama nahi ho sakta. Jaise Payment class me abstract String gateway(); UpiPayment aur CardPayment dono ko apne tareeke se jawab dene par majboor karta hai.

191+ more Object-Oriented Java questions inside

Create a free account to read the full question bank, learn every topic, and practise with an AI mock interview.

Unlock all questions — free

Ready to practise Object-Oriented Java?

Unlock every topic free, then face an AI interviewer that asks follow-ups and grades your answers.

Object-Oriented Java Interview Questions & Answers | Hirenix