This is the approach I would take:
public interface MyInterface {
MyInterface DEFAULT = new MyDefaultImplementation();
public static class MyDefaultImplemenation implements MyInterface {
}
}
Of course, the MyDefaultImplementation may need to be private, or its own top level class, depending on what makes sense.
You can then have the following in your implementations:
public class MyClass implements MyInterface {
@Override
public int someInterfaceMethod(String param) {
return DEFAULT.someInterfaceMethod(param);
}
}
Its a bit more self-documenting, and ultimately more flexible, than a default implementation class that exists elsewhere but is not referenced by the interface. With this you can do things like just pass the default implementation as a method parameter when required (which you cannot do with the static methods).
Of course, the above only works if there is no state involved.