我无法从它的子类访问超类数据成员。
所以我有一个像这样的超类商店
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来获得它......但没有成功。
感谢您的任何见解。
答案 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());
}
}
}