Is it true that the assigned final field of an object can remain zero inside the constructor?

Is it true that the assigned final field of an object can remain zero inside the constructor?

class MyClass {
  private final Object obj = new Object();
  public MyClass() {
    System.out.println(obj); // may print null?
  }
}

if so, is this not a mistake?

+5
source share
5 answers

As discussed by other answers, no, this cannot be. However, with the assigned final static field, it can.

class MyClass {
  private static MyClass myClass = new MyClass();
  private static final Object obj = new Object();
  public MyClass() {
    System.out.println(obj); // will print null once
  }
}
+4
source

This is not possible since all initializers are started before the constructor is called .

Initializer variables, like you, private final Object obj = new Object();are executed before the constructor is called. This also applies to initialization blocks in a static or other way.

, , , . , , .

+3

Object obj = new Object(); , obj null.

, , obj -.

+2

:

$ cat MyClass.java
class MyClass {
    private final Object obj = new Object();
    public MyClass() {
        System.out.println(obj); // may print null?
    }
    public static void main(String[] args) { new MyClass(); }
}
$javac MyClass.java; java MyClass
java.lang.Object@19908ca1

.

, Java 5, this "escape" , final ( null ).

+2

, , . , final, , , .

, " - ", favouriteColour, ​​ "blue" .

abstract class SuperClass {
    final String favouriteColour;

    SuperClass() {
        announceFavouriteColour();
        favouriteColour = "blue";
    }

    abstract void announceFavouriteColour();
}

public class FinalTest extends SuperClass {
    void announceFavouriteColour() {
        System.out.println("My favourite colour is " + favouriteColour);
    }

    public static void main(String[] args) {
        new FinalTest();
    }
}
+2
source

All Articles