ReviseAlgo Logo

Inheritance

Types of Inheritance

Compare single, multilevel, and hierarchical inheritance models, and dissect why multiple inheritance of classes is prohibited.

Interview: Evaluates conceptual trade-offs between deep class hierarchies (fragile base class) and shallow delegation, and mechanisms to model complex types.

Last Updated: June 13, 2026 10 min read

Java defines class hierarchies using structured relationships to prevent state ambiguity. Class inheritance in Java is limited to single, multilevel, and hierarchical models, while multiple class inheritance is prohibited.

Supported Models

Single (A extends B), Multilevel (A extends B extends C), and Hierarchical (B extends A, C extends A) are fully supported.

The Diamond Problem

If two parent classes define conflicting state or methods, inheriting from both creates ambiguity. Java avoids this by blocking multiple inheritance of classes.

Fragile Base Class

Deep class hierarchies introduce high coupling, where modifications to a top-level parent class can break several child classes.

Supported Inheritance Types

Java supports the following structural arrangements:

  • Single Inheritance: A subclass extends a single superclass (e.g., class Dog extends Animal). This keeps hierarchies easy to map.
  • Multilevel Inheritance: A subclass extends a class that is itself a subclass (e.g., class Puppy extends Dog, which extends Animal). Object creation instantiates constructors in order down the chain.
  • Hierarchical Inheritance: Multiple subclasses extend a single parent class (e.g., both Dog extends Animal and Cat extends Animal).

The Diamond Problem

Consider the diamond structure:


      [SuperClass A (defines int x)]
             /           [SubClass B]      [SubClass C]
    (sets x=5)        (sets x=10)
                     /
         [SubClass D]  <-- Ambiguity! What value does x have?
            

If multiple inheritance of classes were allowed, Class D would inherit two distinct versions of the instance variable x. Resolving which version D should use, and how they share space in the heap object memory layout, would require complex compiler rules. Java eliminates this complexity entirely by restricting classes to single inheritance.

Common Pitfalls

  • Deep Multilevel Hierarchies: Designing structures with 5+ levels of class inheritance, creating extreme coupling where code is nearly impossible to refactor or trace.
  • Ignoring Fragile Base Class Risks: Modifying a parent class field type or method signature, which unintentionally breaks subclasses down the hierarchy.

Best Practices

  • Prefer Composition for Behavioral Sharing: If classes only need utility functions, inject dependencies rather than establishing class hierarchies.
  • Restrict Hierarchy Depth: Keep class structures shallow, ideally keeping inheritance levels to a maximum of 2 or 3.

Interview-Relevant Information

Q1: What is the Fragile Base Class Problem?
Answer: It is a architectural vulnerability in object-oriented programming where subclasses are highly dependent on the implementation details of a superclass. If the superclass implementation changes, the subclasses may break even if their public signature remains unchanged.

Q2: If Java doesn't support multiple class inheritance, how can we model a type that has multiple traits?
Answer: By using Interface-based multiple inheritance. Java allows a class to implement multiple interfaces, enabling it to assume multiple polymorphic types and behaviors without inheriting conflicting state.

Quick Checklist

Can you contrast single, multilevel, and hierarchical structures, explain how the diamond problem manifests in class properties, and describe the fragile base class problem? If yes, you understand the types of inheritance.

Use Cases

Modeling organization taxonomies (e.g., Employee -> Manager -> Executive).

Designing geometric shapes systems (e.g., Shape -> TwoDShape -> Circle).

Common Mistakes

Designing deep inheritance hierarchies to avoid duplicating tiny utility blocks, which leads to fragile architecture.

Confusing multilevel class initialization order, expecting subclass constructors to execute before parent constructor blocks.