Cathy,
In that code sample, you're not really accessing teh private variable directly. Rather, you're using an inherited method to access a private variable. Try it like this and I think you'll find it less confusing:
I haven't compiled this myself but, assuming I didn't have any typos,
you should get a compiler error when you try to compile this. Why? Because in the Lower class, you're trying to access a variable named x which doesn't exist in class Lower. It was defined in class Upper, but it doesn't get inherited.
Next, try removing the output of the variable x and leave in the output of the variable y. This works fine. Why? Because y is a public variable defined in the superclass - it IS inherited.
I hope that helps.