# V6052. Calling an overridden method in parent-class constructor may lead to use of uninitialized data.

The analyzer has detected a parent-class constructor that uses a method overridden in the derived class. As a result, the overridden method can be used by uninitialized class fields.

This behavior occurs when you fail to follow the class initialization procedure stated in JLS [12.5].

Consider the following example:

    public class Parent {
      private String parentStr = "Black";

      public Parent () {
        printInfo();
      }

      public void printInfo () {
        System.out.println("Parent::printInfo");
        System.out.println("parentStr: " + parentStr);
        System.out.println("-----------------");
      }
      ....
    }

    public class Child extends Parent {
      private int childInt;
      private String childStr;

      public Child() {
        super();
        this.childInt = 25;
        this.childStr = "White";
      }

      public void printInfo () {
        super.printInfo();
        System.out.println("Child::printInfo");
        System.out.println("childInt: "+childInt+";childStr: "+childStr);
        System.out.println("-----------------");
      }
      ....
    }

If we execute the following line:

    Child obj = new Child();

the program will print:

    Parent::printInfo
    parentStr: Black
    -----------------
    Child::printInfo
    childInt: 0 ; childStr: null
    -----------------

As seen from this fragment, the overridden method 'printInfo' was called in the parent-class constructor of the 'Parent' class, while the derived 'Child' class was not fully initialized – hence the default values, rather than user-specified values, of the 'childInt' and 'childStr' fields.

The conclusion is this: make sure your parent-class constructors do not use methods that could be overridden in child classes. And if you do use a class method in a constructor, declare it final or private.

This diagnostic is classified as:

CERT-MET05-J

You can look at examples of errors detected by the V6052 diagnostic.