0

我想在基类中声明一个数组,但只在子类中实例化它。我需要做一些事情,比如在基类中获取这个数组的长度,但它会显示为空。我只需要实例化子类。我可以这样做吗?提前感谢您的任何帮助...

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 };  
    }  
} 
4

2 回答 2

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;
    }  
}
于 2013-09-14T10:05:04.940 回答
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[] {});
  }
}
于 2013-09-14T11:42:20.727 回答