This week's book giveaway is in the OCPJP forum. We're giving away four copies of OCA/OCP Java SE 7 Programmer I & II Study Guide and have Kathy Sierra & Bert Bates on-line! See this thread for details.
The return type of getInner() is something which does not exists for class Main as Inner is private in class A. However the code compiles fine and gives an output like A$Inner@hgdyeu. But when I replace
then I get the compilation error:
Main.java:12: error: toString() in Object is defined in an inaccessible class or interface
toString() is obviously successfully called in System.out.println(new A().getInner()); as I get the corresponding output. Why does this work and System.out.println(new A().getInner().toString()); does not work?
You can't call methods directly on inaccessible types. However, if you cast them to one that's accessible, then you can. This is exactly what happens when you pass the Inner object to the println() method. Its signature uses the Object class, so the Inner object gets cast to Object before its toString() method is called.
Try to do the same by assigning getInner() to a variable of type Object first, before calling toString().