Can anyone explain why this code is giving output as null? When I try to call new A()
instead of new B()
, it is printing the current date.
class A
{
Date d = new Date();
public A()
{
printDate();
}
void printDate()
{
System.out.println("parent");
System.out.println(d);
}
}
class B extends A
{
Date d = new Date();
public B()
{
super();
}
@Override
void printDate()
{
System.out.println("child");
System.out.println(d);
}
}
public class Test
{
public static void main(String[] args)
{
new B();
}
}
new B() invokes the constructor of B, which invokes the constructor of A. A's constructor calls printDate()
, which, due to the overriding, executes B's printDate()
, which prints the value of d
variable of B
. However, d
variable of B
is not initialized yet (it will only be initialized after the constructor of A is executed). Therefore it is still null (which is the default value for reference variables).
On the other hand, when you create an instance of A
(new A()
), printDate
of A
is called, and it prints the d
variable of A
, which was initialized prior to the constructor of A
being executed.
In case it's not clear, B.d does not override A.d, it just hides it. Only methods can be overridden.
Declare Date
as Static
static Date d = new Date();
public B(){
super();
}
@Override
void printDate(){
System.out.println("child");
System.out.println(d);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With