quiz Programming · 10 questions

Fundamentals of Object-Oriented Programming

help_outline 10 questions
timer ~5 min
auto_awesome AI-generated
0 / 10
Score : 0%
1

Which programming technique first introduced the concept of extracting repeated code into separate procedures?

2

In Java, why does a static variable belong to the class rather than to each instance?

3

Given a class hierarchy where class B extends class A, which statement correctly describes method overriding?

4

Which of the following best explains the difference between static and dynamic binding in a statically typed OO language?

5

In the context of Java interfaces, which statement is true about the methods they declare?

6

When a subclass constructor calls another constructor of the same class using "this(...)", what requirement must be satisfied?

7

Which inheritance type described in the text involves a class hierarchy where a class inherits from a class that itself inherits from another class?

8

Consider a class Point with methods get_x() and get_y(). Which of the following statements about accessing instance variables is most accurate?

9

What is the primary advantage of using templates (generics) in C++ as described in the material?

10

In the Struts framework, what role does the ActionServlet play in handling a request?

menu_book

Fundamentals of Object-Oriented Programming

Review key concepts before taking the quiz

Fundamentals of Object-Oriented Programming (OOP)

Object-oriented programming is a cornerstone of modern software development. It builds on earlier programming paradigms, introduces powerful concepts such as encapsulation, inheritance, and polymorphism, and enables developers to write reusable, maintainable code. This course expands on the key ideas that appear in the quiz, providing clear explanations, examples, and best practices.

1. From Procedural to Object‑Oriented Thinking

The earliest systematic way to avoid duplicated code was procedural programming. By extracting repeated logic into procedures (also called functions or subroutines) and passing parameters, programmers could reuse code without copying it.

  • Procedural programming emphasizes a top‑down flow of control, where data and functions are separate.
  • Object‑oriented programming groups data and behavior together into objects, but it still relies on the procedural idea of reusable code blocks.
  • Other paradigms such as modular programming and unstructured programming address code organization differently, but the first systematic extraction of repeated code came with procedures.

Understanding this historical step helps you appreciate why OOP still values methods—they are essentially procedures bound to a specific class.

2. Static Members in Java

In Java, a static variable belongs to the class itself, not to any individual instance. The JVM allocates static fields when the class is loaded, and all objects share the same memory location.

  • Because the variable is created once, changes made by one object are visible to all other objects of that class.
  • Static members are useful for constants, counters, configuration settings, or any data that must be common across instances.
  • Static fields are initialized in the order they appear in the class, before any constructor runs.

Contrast this with instance fields, which are allocated separately for each object during construction.

3. Method Overriding and Runtime Polymorphism

When a subclass overrides a method, it provides a new implementation with the exact same signature (name, parameter types, and return type) as the method declared in its superclass. At runtime, the JVM determines the actual object's class and invokes the overriding method.

  • Overriding enables dynamic dispatch, allowing code that works with a superclass reference to execute subclass behavior.
  • The @Override annotation in Java helps catch signature mismatches at compile time.
  • Overloading (same method name, different parameters) is a compile‑time feature and does not replace the superclass method.

Example:

class Animal { void speak() { System.out.println("generic sound"); } }
class Dog extends Animal { @Override void speak() { System.out.println("woof"); } }
Animal a = new Dog(); // runtime type is Dog
a.speak(); // prints "woof" because of overriding

4. Static vs. Dynamic Binding

Binding is the process of linking a method call to the actual method code. In statically typed languages like Java, two kinds of binding coexist:

  • Static (early) binding occurs at compile time for private, final, and static members. The compiler knows exactly which method or field to use.
  • Dynamic (late) binding applies to instance methods that are not final or static. The JVM decides at runtime which implementation to execute based on the object's actual class.

Understanding the distinction is crucial for designing flexible APIs and for performance tuning, because dynamic dispatch incurs a small runtime cost.

5. Java Interfaces – Implicit Modifiers

Interfaces define a contract that implementing classes must fulfill. In Java:

  • All declared methods are implicitly public and abstract (unless they are default or static methods introduced in Java 8).
  • Interfaces may contain static final fields (constants) with initialized values, but they cannot hold instance variables.
  • Since Java 9, interfaces can also have private methods to share code among default methods, but these are not part of the public contract.

This design ensures that any class implementing the interface provides concrete implementations for the public abstract methods.

6. Constructor Chaining with this(...)

Java allows a constructor to invoke another constructor of the same class using the this(...) syntax. This technique, called constructor chaining, promotes code reuse and centralizes initialization logic.

  • The this call must be the first statement in the constructor body; otherwise the compiler raises an error.
  • Only one constructor can be called directly; indirect chaining (A calls B, B calls C) is permitted as long as each call obeys the first‑statement rule.
  • If a constructor does not explicitly call super(...) or this(...), the compiler inserts an implicit call to the superclass's no‑argument constructor.

Example:

public class Rectangle {
    private int width, height;
    public Rectangle() { this(1, 1); }
    public Rectangle(int w, int h) { this.width = w; this.height = h; }
}

7. Types of Inheritance

Inheritance describes how classes acquire properties from other classes. The quiz highlights multilevel inheritance, where a class inherits from a subclass that itself inherits from another class (A → B → C).

  • Single inheritance: one class extends one superclass.
  • Multilevel inheritance: a chain of inheritance across three or more levels.
  • Multiple inheritance: a class inherits from more than one superclass (not directly supported in Java; interfaces are used instead).
  • Hierarchical inheritance: multiple subclasses share a common superclass.
  • Hybrid inheritance: a combination of the above patterns, often seen in languages that support multiple inheritance.

Choosing the right inheritance model influences code clarity, reuse, and the risk of the “diamond problem”.

8. Encapsulation and Accessor Methods

Encapsulation hides a class's internal state and exposes it through well‑defined methods. In the Point example, the methods get_x() and get_y() are accessors (or getters) that retrieve private instance variables.

  • Instance variables are typically declared private to prevent direct external modification.
  • Getter methods provide read‑only access, while setter methods (e.g., setX(int x)) allow controlled updates.
  • Encapsulation enables validation, lazy computation, and future refactoring without breaking client code.

Example:

public class Point {
    private int x, y;
    public int get_x() { return x; }
    public int get_y() { return y; }
    public void set_x(int x) { this.x = x; }
    public void set_y(int y) { this.y = y; }
}

9. Putting It All Together – A Mini Project

To reinforce the concepts, build a small hierarchy of geometric shapes:

  • Shape (abstract class) defines a static counter shapeCount and an abstract method area().
  • Rectangle extends Shape, overrides area(), and provides getters for width and height.
  • Square extends Rectangle (multilevel inheritance) and uses constructor chaining to ensure equal sides.
  • Define an interface Drawable with a single method draw(). All concrete shapes implement this interface, demonstrating that interface methods are implicitly public and abstract.

Key takeaways from this exercise:

  • Static fields (shapeCount) are shared across all shape instances.
  • Method overriding enables each subclass to compute its own area while the client code works with a Shape reference.
  • Dynamic binding ensures the correct draw() implementation runs at runtime.
  • Constructor chaining (this(...)) simplifies initialization logic for Square.

10. Frequently Asked Questions (FAQ)

Why are static methods not subject to dynamic binding?

Static methods belong to the class, not to any instance. Since they are resolved at compile time, the JVM does not need to inspect the object's runtime type.

Can an interface contain instance variables?

No. Interfaces may only declare constants (public static final) because they define a contract, not state.

Is multiple inheritance ever safe?

Java avoids the classic multiple inheritance problems by allowing a class to implement multiple interfaces while inheriting from a single class. This provides the benefits of multiple inheritance without the diamond ambiguity.

When should I use getters/setters versus public fields?

Prefer getters and setters to preserve encapsulation. Public fields expose internal representation, making future changes risky and breaking the principle of information hiding.

Conclusion

Mastering the fundamentals of object‑oriented programming equips you to design robust, extensible software. By understanding procedural roots, static versus instance members, method overriding, binding mechanisms, interface contracts, constructor chaining, inheritance hierarchies, and encapsulation, you can write clean Java code that scales. Review the quiz questions, revisit the examples, and experiment with the mini project to solidify your knowledge.

Stop highlighting.
Start learning.

Join students who have already generated over 50,000 quizzes on Quizly. It's free to get started.