Let us consider an example:
public class Test2 { static class TestClass1 { int x = 1; String test() { return "1"; } } static class TestClass2 extends TestClass1 { int x = 2; String test() { return "2"; } } static class TestClass3 extends TestClass2 { int x = 3; int testX() { return ((TestClass1)this).x; } String test() { return super.test(); } } public static void main(String[] args) { TestClass3 obj = new TestClass3(); System.out.println(obj.testX()); System.out.println(obj.test()); } }
It produces expected output
1
2
The point is that there is no way to call test() method of the TestClass1 class!
super.super.test()
won’t compile but
((TestClass1)this).test()
will produce java.lang.StackOverflowError.
Despite that we can access superclass members of any level by casting this to appropriate class (see The Java Language Specification at http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.11.2), polymorphism allows us to access immediate superclass only, not overridden methods of higher levels (see The Java Language Specification at http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.4.9).