First of all, what you are talking about is "access" not "scope". It is important to get the terminology correct. Scope has a different meaning in Java.
An abstract class
is really just like a normal class
with normal implementation details (state variables and code) ... except that some of the implementation is left out; i.e. the abstract
methods. So naturally you want the full repertoire of class language features.
A (pre-Java 8) interface
is different1. Now there is no state and no code, just a "contract" that any implementing class
must fulfill.
Now that doesn't completely address this question, but for the rest, I refer you to this Q&A - Protected in Interfaces - which asks why you can't use protected
in an interface
. As you can see, there isn't a single convincing answer. Rather there are multiple answers proposed, each of which could be valid to a lesser or greater extent. The only way to get the real answer(s) would be to ask James Gosling et al. Ultimately, it was a design choice made early in the life of the Java language.
So, why different rules for both?
Because the purpose of each of the two constructs is different.
1 - With Java 8, we can now declare default
methods in an interface
. In other words, there can be code in an interface
now, albeit code that is common to all classes that implement the interface.