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() {
      System.out.println("BigEgg2.Yolk.f()");
    }
  }
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
} ///:~

-----------------------------------------------------
Outputs:
-----------------------------------------------------
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
---------------------------------------------------
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....


kellyputtyAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

funnyveryfunnyCommented:
Because Java silently added line Super() as first line in a constructor. So infact your constructor looks like this:
         BigEgg2(){
              super();
              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.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
kellyputtyAuthor Commented:
Thank you, I am starting to understand this.
funnyveryfunnyCommented:
:)
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.