Excuse any minor syntax errors or whatnot, I'm experiencing this with a Jitsi module and not being super familiar with Java want to confirm what is going on and why and how it should be fixed.
public abstract class A
{
public A()
{
this.load();
}
protected void load()
{
}
}
public class B extends A
{
private String testString = null;
public B()
{
super();
}
@Override
protected void load()
{
testString = "test";
}
}
The application is doing this when creating an instance of the class B using a load class by name method:
Is this expected Java behavior? What could cause this? It's a Java 1.6 application running on the 1.7 JDK.
Is this expected Java behavior?
Yes.
What could cause this?
Your invocation of non-final overridden method in non-final super class constructor.
Let's see what happens step-by-step:
B
.B()
calls super class constructor - A()
, to initialize the super class members.A()
now invokes a non-final method which is overridden in B
class, as a part of initialization.B
class, the method load()
invoked is of B
class.load()
initializes the B
class instance field - testString
.Object
class have been finished)B()
constructor starts executing further, initializing it's own member.B
overwrites the previous written value in testString
, and re-initializes it to null
.Moral: Never call a non-final public method of a non-final class in it's constructor.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments