If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface. It is a compile-time error if the interface explicitly declares such a method m in the case where m is declared to be final in Object.
The above simply says all interface methods are implicitly public and abstract, if you want defult access you might have to change some compiler code.
Note that although interface methods have to be public, neither the interface nor the classes that implement it have to be public. If you have package-protected classes that implement a package-protected interface, then those public methods really aren't accessible outside of the package. So what you can do is split your interface into a public one and a package-level one, and have your implementation classes be package-protected and handed out using a factory, if necessary, so that code outside your package can only see the public interface part of the class.
Originally posted by Abdulla Mamuwala:
The above simply says all interface methods are implicitly public and abstract
Although all interface methods are implicitly public and abstract, this passage says nothing of the sort. What this passage says is that interfaces implicitly include declarations of the set of public instance methods of java.lang.Object. True, and good, but utterly unrelated to this question.