public class Test {

  interface Functional {
    int f();
  }

  class Concrete implements Functional {
    public int f() { return 0; }
  }

  interface FunctionalWithDefaults {
    int f();

    default int g() { return 1; }
  }

  interface NotFunctional {
    default int g() { return 1; }
  }

  interface FunctionalWithObjectMethods {
    int f();

    String toString();

    int hashCode();
  }

}

public class Test {

  interface Functional {
    int f();
  }

  class Concrete implements Functional {
    public int f() { return 0; }
  }

  interface FunctionalWithDefaults {
    int f();

    default int g() { return 1; }
  }

  interface NotFunctional {
    default int g() { return 1; }
  }

  interface FunctionalWithObjectMethods {
    int f();

    // Not actually abstract; implementation comes from Object
    boolean equals(Object obj);
    int hashCode();
    String toString();
  }

  interface NotFunctionalWithObjectMethods {
    int f();

    // Increases their visibility from `protected` to `public`; this requires subclasses to implement them
    // See also JLS section "Functional Interfaces" which explicitly covers this
    Object clone();
    void finalize();
  }

}

Extend functional interfaces test