Memra

Interfaces & complete decoupling

◈ 7 cards

A pure contract: no implementation, no state — and a class may implement many.

The pure contract

An interface is a contract with (classically) no implementation at all — it says what methods a type provides, never how. Where an abstract class can be "partly built," an interface is "nothing but the API." This gives complete decoupling: code written against an interface neither knows nor cares which concrete class actually shows up at run time.

Classic rules (the ones an exam tests):

  • Interface methods are implicitly public and abstract — you write the signature, no body.
  • A class uses implements (not extends) and must provide a body for every method.
  • A field declared in an interface is implicitly public static final — a constant, not instance state.
  • A class may implement many interfaces (implements A, B, C) — Java's controlled form of "multiple inheritance," because interfaces carry no state to collide.

Worked example — the project's Fixable

The Greenhouse system needs anything that can recover from a fault to expose two operations — attempt a fix and record what happened. That is a contract, so it is an interface:

public interface Fixable {
  void fix();
  void log();
}

Two unrelated classes can both satisfy it without sharing a base class:

class FixWindow implements Fixable {
  public void fix() { /* close & reseal the window */ }
  public void log() { /* append to fix.log */ }
}

class FixPower implements Fixable {
  public void fix() { /* switch to backup power */ }
  public void log() { /* append to fix.log */ }
}

Now recovery code can hold Fixable f and call f.fix(); f.log(); against either class — it is decoupled from the concrete type. A class can also be a Fixable and something else at once:

class Restart extends Event implements Fixable, Runnable {
  public void action() { /* reschedule events */ }
  public void fix()    { /* ... */ }
  public void log()    { /* ... */ }
  public void run()    { /* ... */ }
}

It extends exactly one class but implements as many interfaces as it needs — each adds a capability without adding state.

A note on default methods (Java 8+)

Modern Java lets an interface supply a default method with a body so implementers can inherit it. The AU exam is anchored to Thinking in Java 4e (pre-Java-8), so treat the classic "no bodies" rule as the exam answer, and default methods as real-world context.

extends (max 1)implementsimplementsRestartone concrete classEventabstract class; carries stateFixablefix(), log()Runnablerun()
Accent nodes are interfaces; the plain node is a class. Restart extends exactly one class but implements as many interfaces as it needs, so a single object is usable through three different types.
abstract classinterfaceinstance fieldsyes, real stateno, only constantsconstructoryes: Event(long)nomethod bodiesyes, plus abstract onesnone (TIJ 4e rule)how many per classextends 1implements manydefault methodsn/aJava 8+ onlyNo state to collide is why many interfaces are safe.
The two discriminators an exam leans on: only an abstract class carries instance state and a constructor, and only interfaces come in unlimited quantity per class. Everything else follows from those.
NORMAL ~/memra/learn/comp-308/interfaces-and-decoupling utf-8 LF