method() is visible only in Base class. It runs through a variable of Base type. When method() is called, it prints the name of the classe of the object is currently running (which is an instance of Derived).
ok... what is happening here... when you write method() in Derived class you are actually creating a new method... you are not overriding that one in Base class... you can check this by trying to change the return type or even declaring new checked exceptions in class Derived (things that wouldn't be possible if you were overriding Base's method().
private methods are not visible by the subclasses. In this case if the derived class is supposed to have a method with same signature, it is not overriding of method. It is just another method. More clearly, polymorphism doesn't apply there. In other words, the derived class version of the method wont be called using the base class ref variable. This is because you have not overridden the method, private methods are not visible.