2013-02-10 70 views
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()); 
     } 
    } 
} 

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

我试图通过使用super.ab ....但没有成功。

感谢您的任何见解。

+0

** **在哪里,你得到的异常?什么是堆栈跟踪? – SLaks 2013-02-10 02:19:48

+0

这是因为,从给定的代码,'ab'没有实例化('new ArrayList ()')。 – pickypg 2013-02-10 02:20:01

+0

超类中的'ab'初始化在哪里? – mre 2013-02-10 02:21:42

回答

1

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

最有可能你没有创建该对象的任何地方,尝试做

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

另外,如果你使用的最一般的接口List

protected List<Audiobooks> ab = new ArrayList<Audiobooks>(); 
+0

对不起,如果我没有从我的问题提示中清楚地说明它,但是,有一个测试驱动程序和ab对象被实例化。如果我只是将printAb函数移动到Store类并从商店对象中调用它,它就可以正常工作。问题是在客户类中具有该功能。如果我将printAB函数移入客户类,那么我会得到一个空指针异常。 – wzsun 2013-02-10 02:24:52

+0

也许你在子类中使用了不同的构造函数(我假设该属性在那里被分配了一个对象)。 “Store”和“Customer”中构造函数的代码是什么? – SJuan76 2013-02-10 02:28:06

+0

我添加了商店和客户的构造函数代码 – wzsun 2013-02-10 02:35:35

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

;或者你的客户的构造器的列表。您还必须拥有多个商店类的构造函数,否则编译器会强制您调用您所显示的构造函数。如果不将类放入有效状态,您可能需要考虑摆脱商店类中显然拥有的空构造函数。

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()); 
      } 
     } 
    }