Why I can not access getCount() method in Class 1? I thought methods/variables availability depends on the actual object and not on the reference type.
Both come into play. All the compiler knows is that you have a reference to MyInterface. If you want to use something that was added in the impl, you have to cast it to that. However, doing so is probably a sign of a design flaw. If you intend to use it as an impl, because you know and care about details of that particular implementation, then you should have declared the variable as an impl.