There are four ways to initialize references:
1. When the objects are defined. This means they'll always be initialized before the constructor is called.
2. In the constructor for that class.
3. Right before you actually use the object. This is ofthen called lazy initialization. It can reduce overhead in situations where object creation is expensive and the object doesn't need to be created every time.
4. Using instance initialization.
All four approaches are shown here:
// reuse/Bath.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Constructor initialization with composition
class Soap {
private String s;
Soap() {
System.out.println("Soap()");
s = "Constructed";
}
@Override
public String toString() {
return s;
}
}
public class Bath {
private String // Initializing at point of definition:
s1 = "Happy",
s2 = "Happy",
s3,
s4;
private Soap castille; // Composition Syntax
private int i;
private float toy;
public Bath() {
System.out.println("Inside Bath()");
s3 = "Joy";// Initializing in Bath constructor
toy = 3.14f;
castille = new Soap();
}
// Instance initialization:
{
i = 47;
System.out.println("initialize i.");// I added to test initialize order
}
@Override
public String toString() {
if (s4 == null) {// Delayed initialization:
s4 = "Joy";
System.out.println("lazy initialization.");
}
return "s1 = "
+ s1
+ "\n"
+ "s2 = "
+ s2
+ "\n"
+ "s3 = "
+ s3
+ "\n"
+ "s4 = "
+ s4
+ "\n"
+ "i = "
+ i
+ "\n"
+ "toy = "
+ toy
+ "\n"
+ "castille = "
+ castille;
}
public static void main(String[] args) {
Bath b = new Bath();
System.out.println(b);
}
}
/* My Output:
initialize i.
Inside Bath()
Soap()
lazy initialization.
s1 = Happy
s2 = Happy
s3 = Joy
s4 = Joy
i = 47
toy = 3.14
castille = Constructed
*/
references:
1. On Java 8 - Bruce Eckel
2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/reuse/Bath.java
本文探讨了在Java中初始化类成员变量的四种主要方法:定义时初始化、构造函数初始化、延迟初始化及实例初始化,并通过具体代码示例展示了每种初始化方式的应用场景与特点。
967





