Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 219
  • Last Modified:

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....


0
kellyputty
Asked:
kellyputty
  • 2
1 Solution
 
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.
0
 
kellyputtyAuthor Commented:
Thank you, I am starting to understand this.
0
 
funnyveryfunnyCommented:
:)
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now