ok, this is going to be big reply.....
Q1:When you call static methods with object references (bc.sayHello()), it goes by the type of the variable and not the type of the actual object itself. In other words, bc.sayHello() is equivalent to BaseClass.sayHello(). Since, bc is of type BaseClass, the sayHello method of BaseClass was executed. If the sayHello method was not static, then the SubClass's sayHello method would have been executed because of polymorphism.
Q2: The given answer is right. I think you are confused with super() of constructor and super.normalmethod(). The restriction that you talk about (being the first statement) applies only to a super() call to the CONSTRUCTOR of a base class. Here, aMethod() is not a constuctor. It is a normal method. And the super.aMthod() statement can be anywhere in the aMethod() of subClass.
Q3: When you declare explicit constructors for a class, then you need to define the default constructor too explicitly. Here, the BaseClass does not have a default constructor. So, when the SubClass object is created (and since there is no explicit calls to any of the BaseClass's declared constructors), it will place a call to BaseClass() (default) constructor of the BaseClass. Since it doesn't find it, it will give a compile error.
Q4: Once a method throws an Exception, the control gets out of the method. So, the i-- statement is never executed here. And the compiler objects to such unreachable code.
Also, IOException can be thrown since it implements the Throwable interface.
Q5: These are the objects that are created by this code:
1. "Hello"
2. "Pal"
3. "HelloPal" (coz of s2+"Pal")
s1 and s2 both point to the "Hello" object. s3 and s4 both point to the "HelloPal" object.
Hope the explanations are clear.
Srikrish