1

我无法从它的子类访问超类数据成员。

所以我有一个像这样的超类商店

public class Store {
    protected ArrayList<Audiobooks> ab;

    public Store(ArrayList<Audiobooks> ab)
    {
        this.ab = ab;
    }
    ...
}

ab 被初始化,一切,然后我们有一个像这样的子类

public class Customer extends Store {

    ...
    public Customer(String id, String name, String address)
{
    this.id = id;
    this.name = name;
    this.address = address;
    }
    public void printAb(){
        for(int i = 0; i<ab.size(); i++){
            System.out.println(ab.get(i).toString());
        }
    }
}

我最终得到一个空指针异常错误。当函数放在 store 类中时它工作正常,但是当它在子类 Customer 中时会发生空指针异常。

我试图通过使用 super.ab.... 来获得它,但没有成功。

感谢您的任何见解。

4

3 回答 3

3

您的Customer构造函数不会调用您Store的构造函数,因此该ab列表永远不会被实例化。

要解决这个问题,您需要让客户构造函数调用商店构造函数:

public Customer(String id, String name, String address) {
    super(new ArrayList<Audiobooks>());
    this.id = id;
    this.name = name;
    this.address = address;
}

或者让您的客户构造函数实例化列表。对于 store 类,您还必须有多个构造函数,否则编译器会强制您调用正在显示的构造函数。如果它没有将类置于有效状态,您可能需要考虑摆脱您显然在 store 类上拥有的空构造函数。

于 2013-02-10T02:43:15.120 回答
1

您可以正确访问该ab属性(否则您会遇到编译器错误)。

很可能您没有在任何地方创建对象,请尝试执行

 protected ArrayList<Audiobooks> ab = new ArrayList<Audiobooks>();

另外,如果您使用最通用的接口会更好List

 protected List<Audiobooks> ab = new ArrayList<Audiobooks>();
于 2013-02-10T02:21:22.027 回答
0

尝试这样做。

public class Customer extends Store {

    ...
    public Customer(ArrayList<Audiobooks> a,String id, String name, String address)
{
    super(a);
    this.id = id;
    this.name = name;
    this.address = address;
    }
    public void printAb(){
        for(int i = 0; i<ab.size(); i++){
            System.out.println(ab.get(i).toString());
        }
    }
}

或者这样做

public class Customer extends Store {

        ...
        public Customer(String id, String name, String address)
    {
        a=new ArrayList<Audiobooks>(/*initial size*/);
        this.id = id;
        this.name = name;
        this.address = address;
        }
        public void printAb(){
            for(int i = 0; i<ab.size(); i++){
                System.out.println(ab.get(i).toString());
            }
        }
    }
于 2013-02-10T02:53:22.217 回答