Question:
The following code works:
public class MyClass { private int value; public MyClass() { this(1); } public MyClass(int v) { value = v; }}
Changing the null constructor to:
public MyClass() { this(defaultValue()); }
and adding:
private int defaultValue() { return 1; }
does not compile. Why?
Answer:
A general rule of object-oriented programming languages is that you cannot invoke methods of a subclass before all its superclasses have been constructed. At least this holds for C++ and Java. When you use defaultValue()
as an argument to the second constructor, the java.lang.Object
constructor has not yet been invoked. You can’t call methods in MyClass
until after the basic object has been created, which would be inside the constructor after the superclass constructor. For the purposes of your example, you should just use a constant to denote a default value, such as:
static final int _DEFAULT_VALUE = 1;