Java 字段初始化中的混乱:影子的作用
在类构造函数中声明和初始化字段时,您可能会遇到令人费解的情况:尽管您进行了初始化工作,但字段仍然为空或保留其默认值。发生这种情况是由于一种称为阴影的现象。
范围和阴影
Java中的每个实体都有一个范围,它决定了它可以在哪里使用其简单名称进行引用。当您在类中声明字段时,它们的作用域涵盖整个类主体,包括嵌套声明。
局部变量与字段
在构造函数中,您可能会无意中引入与字段同名的局部变量。局部变量的作用域较窄,仅在构造函数体内扩展。当局部变量使用与字段相同的名称声明时,它们会遮蔽字段,这意味着局部变量在其范围内优先。
遮蔽示例:
考虑这段代码:
public class Sample { private String[] elements; private int capacity; public Sample() { int capacity = 10; String[] elements; elements = new String[capacity]; } }
这里,构造函数遮蔽导致了混乱。局部变量容量和元素优先于字段,导致字段成员保持为 null 或初始化为其默认值(0 表示 int,null 表示引用)。
潜在解决方案:
为了避免阴影,请考虑对局部变量使用唯一的名称,或者使用其限定名称显式引用该字段(例如 this.elements、这个.容量)。例如:
public Sample() { this.capacity = 10; this.elements = new String[capacity]; }
其他遮蔽实例
遮蔽也可以与构造函数参数一起发生。如果构造函数参数与字段同名,则该参数在构造函数主体中优先。要在这种情况下访问该字段,请使用带有此限定的名称。
避免建议:
为了防止由于阴影导致的意外行为,通常建议使用不同的名称字段、局部变量和构造函数参数的名称。
以上是尽管在构造函数中进行了初始化,为什么我的 Java 字段仍为空?的详细内容。更多信息请关注PHP中文网其他相关文章!