BaseClass baseObj = new DerivedClass();
works because, by definition, a DerivedClass object is implicitly a BaseClass.
DerivedClass derObj = new BaseClass();
does not work because a BaseClass object is not systematically a DerivedClass ; it could be another object defined as derived from BaseClass, but different from DerivedClass.