i think it is because of
polymorphism...
say you have a ClassA, with a public doSomething() method.
now, ClassB extends ClassA. say you could make B's doSomething() private.
now you make a collection of ClassA. you get a ClassB object, which you can put into the collection, since a ClassB is a ClassA.
now you iterate through the collection, calling doSomething() on every object. when you get to that ClassB, you're gonna have a problem...
There are only two hard things in computer science: cache invalidation, naming things, and off-by-one errors