overriding inner classess

The following code:
class Egg2 {
  protected class Yolk {
    public Yolk() { System.out.println("Egg2.Yolk()"); }
    public void f() { System.out.println("Egg2.Yolk.f()");}
  private Yolk y = new Yolk();
  public Egg2() { System.out.println("New Egg2()"); }
  public void insertYolk(Yolk yy) { y = yy; }
  public void g() { y.f(); }

public class BigEgg2 extends Egg2 {
  public class Yolk extends Egg2.Yolk {
    public Yolk() { System.out.println("BigEgg2.Yolk()"); }
    public void f() {
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
} ///:~

New Egg2()
1)  Is the first Egg2.Yolk() created by an upcast  via insertYolk method of the BigEgg2 constructor which in turn intantiates the Yolk constructor?
2) Next the base class Egg2's constructor is called resulting in: New Egg2?
3) I am at a loss as to how the last three were instantiated....

Who is Participating?
Because Java silently added line Super() as first line in a constructor. So infact your constructor looks like this:
              then your codes here....

Therefore Egg2 is instantiated first. Also because all class-member variables are loaded before its constructor at runtime so this line in your code:
         private Yolk y = new Yolk();

is loaded first hence initial output: "Egg2.Yolk()" then whatever codes in Egg2(). So next output is "New Egg2". So once super() is completed, it then calls the code in BigEgg2()'s constructor which is this next output is "Egg2.Yolk" - again remember super() of yolk is called first - then "BigEgg2.Yolk()".

Finally e2.g is called.
kellyputtyAuthor Commented:
Thank you, I am starting to understand this.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.