Derived is subclass of Base class. Unless Base reference points to a Derived object, you cannot type cast a Base reference to Derived reference.
For eg. if you change your code to Base objBase = new Derived(); Derived objDer = (Base) objBase;
then you would not face any runtime exception. That is because extends means is-a. Consider a class Animal, which is extended by two other classes Dog and Horse. Both Dog object and Horse Object is an Animal. That is why at runtime, unless the Animal reference was earlier pointing to Dog, it cannot be typecasted to a Dog reference. Hope my explanation helps.
Q.2) You can access by n.i; and not Balach2.n.i; You can access static member variables with the class name. In this example n is not a member variable at all. It is a reference present in the main method.
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.