Looks like there is some confusion here. Let me try to blow the dust out

My explanation below basically supplements Vani's arguments and her 'corrected' class code.
This code deals with two concepts - overriding and inner classes. Lets get these concetps straightened out first.
overriding - The class inner_c extends the class tester and overrides the method printval(). Everything here is legal.
Innerclass - - The class inner_c is an inner class of class tester. Angel, note that
it is not defined in a method scope, but it is defined in a class scope. We all know to create an instance of this kind of inner class, we need a reference to the outer class. Since the inner_c instance is being created in the method tester.caller the outer instance 'this' serves as the enclosing context for the inner_c instance 'c' being created. Everything here is legal too.
So far so good.
Now lets look at the main method.
Line 1 : tester t = new tester() ; This creates an
object of type tester and assigns it to a reference of type tester. Perfectly valid "plain vanilla " line of code.
Line 2 : tester temp = t.caller(false); This
calls the method on the tester object. Note the type of the object being returned is inner_c, the reference it is being assigned to is tester. We know this is possible( and permitted ) according to reference conversion rules.
Line 3: temp.printval(); The final truth!.
Here
temp is of type inner_c hence
run time polymorphism kicks in. It calls the printval() method on the inner_c instance which prints "initizlized inner i 5". The emphasis here is on the
type of object temp is pointing to, and not its declared type. I hope things are clear now.
Ajith