Java父类私有数组经子类初始化后仍为null的解决方案问询
问题根因
- 你当前贴的代码存在编译错误,父类
getTestValues方法返回值声明为Measurement[],但实际返回的是Test[]类型的成员变量,需要先修正类型匹配问题。 - Java方法返回引用类型时,返回的是引用地址的值拷贝,而非引用本身。你在子类构造中执行
Test[] measures = super.getTestValues();时,拿到的只是父类test_Values当前值(也就是null)的拷贝,后续给measures赋值new Test[4]只是修改了局部变量measures的指向,完全不会影响父类中私有成员test_Values的实际存储值。 - 父类的
test_Values用private修饰,属于父类私有成员,子类没有直接访问该变量的权限,不可能直接通过引用修改父类中该变量的指向。
可行解决方案
方案1:父类新增setter方法(最推荐,符合封装规范)
在父类中补充数组的setter方法,子类直接调用setter完成赋值即可:
// 父类补充setter public abstract class Superclass { private Test[] test_Values; public Test[] getTestValues() { return this.test_Values; } // 新增set方法 public void setTestValues(Test[] test_Values) { this.test_Values = test_Values; } } // 子类构造修改为 public class ChildClass extends SuperClass { public ChildClass() { super.setTestValues(new Test[4]); } }
方案2:父类定义抽象初始化方法,无需额外setter
如果不想对外暴露setter,可以让父类定义抽象的数组初始化方法,父类构造阶段主动调用该方法完成赋值:
public abstract class Superclass { private Test[] test_Values; public Superclass() { // 父类构造调用子类实现的初始化方法,完成数组赋值 this.test_Values = initTestValues(); } public Test[] getTestValues() { return this.test_Values; } // 定义抽象初始化方法,子类实现 protected abstract Test[] initTestValues(); } // 子类实现初始化方法即可 public class ChildClass extends SuperClass { @Override protected Test[] initTestValues() { return new Test[4]; } public ChildClass() { // 无需额外赋值逻辑,父类构造会自动完成初始化 } }
注意:使用方案2时,不要在
initTestValues方法中访问子类的非静态成员变量,父类构造执行时子类成员还未完成初始化,会触发空指针异常。
内容的提问来源于stack exchange,提问作者Theodor H
相关产品推荐
相关产品推荐

