Reputation: 259
I am an AP Java Student and I am practicing for my exam. I came across this question and I don't understand the answer:
Consider the following classes:
public class A
{
public A() { methodOne(); }
public void methodOne() { System.out.print("A"); }
}
public class B extends A
{
public B() { System.out.print("*"); }
public void methodOne() { System.out.print("B"); }
}
What is the output when the following code is executed:
A obj = new B();
The correct answer is B*. Can someone please explain to me the sequence of method calls?
Upvotes: 19
Views: 14970
Reputation: 53037
The base class must be constructed before the derived class.
First A()
is called which calls methodOne()
which prints B
.
Next, B()
is called which prints *
.
Upvotes: 2
Reputation: 691685
The B constructor is called. The first implicit instruction of the B constructor is super()
(call the default constructor of super class). So A's constructor is called. A's constructor calls super()
, which invokes the java.lang.Object constructor, which doesn't print anything. Then methodOne()
is called. Since the object is of type B, the B's version of methodOne
is called, and B
is printed. Then the B constructor continues executing, and *
is printed.
It must be noted that calling an overridable method from a constructor (like A's constructor does) is very bad practice: it calls a method on an object which is not constructed yet.
Upvotes: 40