我想在基类中声明一个数组,但只在子类中实例化它。我需要做一些事情,比如在基类中获取这个数组的长度,但它会变为null。我只需要实例化子类。我可以这样做吗?谢谢你提前帮忙......
public class A {
protected int[] array;
public void someMethod() {
variable = array.length;
}
}
public class B extends A {
public void doSomething() {
array = new int[] { 1,2,3 };
}
}
答案 0 :(得分:2)
如果可以将A声明为抽象,则可以这样做。
public abstract class A {
protected int[] array;
public void someMethod() {
int[] array = getArray();
variable = array.length;
}
protected abstract int[] getArray();
}
public class B extends A {
public int[] getArray() {
if(array == null){
array = new int[] { 1,2,3 };
}
return array;
}
}
尽管如此,你不应该使用A作为从某个子类初始化的变量持有者。 这可能会使开发人员感到困惑,因为他们可能不知道调用哪个方法初始化数组,因为他们可能不知道所有子类。
更好的方法是使用抽象方法。
public abstract class A {
public void someMethod() {
int[] array = getArray();
variable = array.length;
}
protected abstract int[] getArray();
}
public class B extends A {
private int[] array;
public int[] getArray() {
if(array == null){
array = new int[] { 1,2,3 };
}
return array;
}
}
答案 1 :(得分:0)
适当的封装应该适用于您的情况:
public class A {
private final int[] array;
public A(final int[] array) {
this.array = array;
}
public int[] getArray() {
return this.array;
}
// other methods...
}
public class B extends A {
public B() {
// instantiate the array
super(new int[] {});
}
}