Sunday, 30 August 2026

Diamond Problem in Java

 

🔷 Diamond Problem in Java — Simple Explanation

The Diamond Problem occurs when a class inherits the same method from two different parents, and the compiler doesn't know which implementation to use.

It gets its name from the diamond-shaped inheritance structure:

        A
       / \
      B   C
       \ /
        D

If both B and C inherit/define the same method from A, what should D use?


1. Diamond Problem with Classes ❌

Java does not allow multiple class inheritance.

For example:

class A {
    void show() {
        System.out.println("A");
    }
}

class B extends A {
}

class C extends A {
}

// ❌ Not allowed
class D extends B, C {
}

Java gives a compile-time error because:

D
↙ ↘
B  C
 \ /
  A

Java avoids this ambiguity by simply not allowing a class to extend multiple classes.


2. But Java Allows Multiple Interfaces ✅

Java allows:

class MyClass implements InterfaceA, InterfaceB

So what happens if both interfaces have the same default method?

Example

interface A {
    default void show() {
        System.out.println("A");
    }
}
interface B {
    default void show() {
        System.out.println("B");
    }
}

Now:

class C implements A, B {
}

❌ Compile-time error.

Why?

Java doesn't know whether:

C.show()
   ↓
 A.show() ?
   OR
 B.show() ?

This is the Diamond Problem with interfaces.


3. Solution — Override the Method ⭐

The easiest solution is for the child class to provide its own implementation.

interface A {
    default void show() {
        System.out.println("A");
    }
}
interface B {
    default void show() {
        System.out.println("B");
    }
}

Now:

class C implements A, B {

    @Override
    public void show() {
        System.out.println("C");
    }
}

Then:

C obj = new C();
obj.show();

Output:

C

Why?

Because C explicitly tells Java:

"Don't be confused. Use my implementation."


4. What if I want A's implementation?

Java provides a special syntax:

InterfaceName.super.method()

Example:

class C implements A, B {

    @Override
    public void show() {
        A.super.show();
    }
}

Output:

A

Similarly:

class C implements A, B {

    @Override
    public void show() {
        B.super.show();
    }
}

Output:

B

So you can explicitly choose the implementation.


5. Very Simple Real-Life Example

Imagine two interfaces:

interface Father {
    default void speak() {
        System.out.println("Father speaks");
    }
}
interface Mother {
    default void speak() {
        System.out.println("Mother speaks");
    }
}

Child:

class Child implements Father, Mother {
}

❌ Problem:

Child.speak()
      ↓
   Father?
      OR
   Mother?

Solution:

class Child implements Father, Mother {

    @Override
    public void speak() {
        Father.super.speak();
    }
}

Now:

Child c = new Child();
c.speak();

Output:

Father speaks

⭐ Interview Answer

If Barclays interviewer asks:

"What is the Diamond Problem in Java and how does Java solve it?"

Say:

The Diamond Problem occurs when a class gets the same method through multiple inheritance paths, creating ambiguity about which implementation should be used. Java avoids this problem by not allowing multiple inheritance of classes. Java does allow multiple interfaces, but if two interfaces provide the same default method, the implementing class must override that method and resolve the ambiguity explicitly. We can also call a specific interface's default implementation using InterfaceName.super.method().

Remember this diagram

Multiple Classes ❌

        A
       / \
      B   C
       \ /
        D

Java doesn't allow D extends B, C


Multiple Interfaces ✅

       A     B
        \   /
          C

If A & B have same default method
             ↓
       C must override
             ↓
       A.super.method()
       OR
       B.super.method()

Key interview phrase:

"Java prevents the diamond problem in classes by disallowing multiple class inheritance, and resolves it for interface default methods by requiring the implementing class to explicitly override the conflicting method."

No comments:

Post a Comment