На самом деле вызывать не стоит только виртуальные методы. Т.к. если класс наследник его переопределит, то возникнет ситуация, когда метод работает до вызова конструктора класса-наследника. И если в этом методе используются какие-нибудь поля класса-наследника, они могут быть еще непроинициализированы.
А так как в Java
In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final, which cannot be overridden, along with private methods, which are not inherited, are non-virtual.
то в конструкторе не стоит вызывать любые публичные не final методы.
Ниже C# код (т.к. работаю в основном с этим языком), иллюстрирующий это.
void Main()
{
new B("name");
}
class A
{
public A()
{
Method();
}
protected virtual void Method()
{
}
}
class B : A
{
private string Property { get; set; }
public B(string value)
{
Property = value;
}
protected override void Method()
{
Console.WriteLine(Property.Length);
}
}
Результат: Object reference not set to an instance of an object.
StackTrace
at UserQuery.B.Method()
at UserQuery.A..ctor()
at UserQuery.B..ctor(String value)
at UserQuery.Main()