如何从子类获取超类数据成员

时间:2013-02-10 02:18:32

标签: java inheritance super

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

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

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来获得它......但没有成功。

感谢您的任何见解。

3 个答案:

答案 0 :(得分: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;
}

或让您的客户构造函数实例化列表。您还必须为商店类提供多个构造函数,否则编译器会强制您调用正在显示的构造函数。如果没有将类放入有效状态,您可能需要考虑删除显然存在于商店类上的空构造函数。

答案 1 :(得分:1)

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

很可能你不是在任何地方创建对象,尝试

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

此外,如果您使用最通用的界面List

会更好
 protected List<Audiobooks> ab = new ArrayList<Audiobooks>();

答案 2 :(得分: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());
            }
        }
    }