﻿# 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](https://docs.oracle.com/javase/specs/jls/se10/html/jls-12.html) \[12\.5\]\.

Consider the following example:

```cpp
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:

```cpp
Child obj = new Child();
```

the program will print:

```cpp
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\.