从抽象和子类java创建对象数组

时间:2011-11-10 00:04:28

标签: java arrays class object abstract

希望有人能够帮助我,或指出我正确的方向。 我有一个包含许多条目的文本文件

  

CUST001,John Jones,555 0505,19/09/1981
      CUST002,PeterParker,555 1234,0.2
      CUST003,Michael Michaels,555 4321,19 / 09/1981
      等等

我有一个抽象的超类,包含共享属性和子类的构造函数和访问器。 然后我有另一个类,也有构造函数和访问器。

我在每行读取,并将其拆分为“,”并将其读入临时数组。然后我创建我的空数组以从我的超类和构造函数中读取属性,我创建了各种对象。

我遇到的问题: 常规类与构造函数 - 这项工作完美。我创建了对象并将它们打印出来后打印出来。

我的子类虽然只返回值null,null,null 因此我假设我的超类和子类存在问题。

使用具体的类构造函数创建对象:

Product[] prod = new Product[20]; 
BufferedReader inFile = new BufferedReader (new FileReader("product.txt"));
String inputLine = inFile.readLine();
for (int i = 0; i < 6 ; i++)
{
    String[] tmpProd = inFile.readLine().split(","); 
    prod[i] = new Product( tmpProd[0], 
                           tmpProd[1], 
                           tmpProd[2],
                           Float.parseFloat(tmpProd[3]),
                           tmpProd[4].charAt(0));
}

“尝试”从超类(Customer)和subClass(STCustomer)创建对象:

Customer[] stdCust= new STCustomer[20];
BufferedReader inFileCust = new BufferedReader (new FileReader ("customer.txt"));
String inputCust = inFileCust.readLine();
for (int i = 0; i < 6; i++)
{
    String[] tmpCust = inFileCust.readLine().split(",");
    GregorianCalendar d = new GregorianCalendar(year, month -1, date);
    stdCust[i] = new STCustomer(    tmpCust[0],
                                 tmpCust[1], 
                                 Long.parseLong(tmpCust[2]), 
                                 d);//the block to convert date works - omitted here
}  

这是创建对象的正确方法吗?

Customer[] stdCust= new STCustomer[20];

3 个答案:

答案 0 :(得分:2)

问题在于您的子类构造函数。您必须显式调用所需的超类构造函数,否则编译器将添加super()作为子类构造函数中的第一个语句。以下是一个例子。

import java.util.Date;

public class Test {
         public static void main(String... abc){
             Customer[] a = new STCustomer[20];
             a[0] = new STCustomer();
             a[1] = new STCustomer("Hello","World",12L,new Date());
             a[1] = new STCustomer("Hello","World",12L);
         }
}

class Customer{
    public Customer(){
        System.out.println("Customer()");
    }

    public Customer(String a, String b, long c,Date d){
        System.out.println("Customer(String a, String b, long c,Date d)");
            // Set values to fields
    }
}

class STCustomer extends Customer{
    public STCustomer(){}

    public STCustomer(String a, String b, long c,Date d){

    }

    public STCustomer(String a, String b, long c){
      super(a,b,c,new Date());
    }
}

和输出

Customer()
Customer()
Customer(String a, String b, long c,Date d)

答案 1 :(得分:0)

不,你不应该使用数组。请改用List<Customer>,并对其简单的API感到满意。您可以使用它的addsize方法,而不必自己跟踪大小。您还可以拥有20多个客户,代码仍然有效。

以下是一些示例代码:

List<Customer> customers = Lists.newArrayList();

...
while ((line = bufferedReader.readLine()) != null) {
  ...
  customers.add(new Customer(...));
}

for (Customer customer : customers) {
  System.out.println(customer.getId());
}

答案 2 :(得分:0)

这是我犯的很多错误之一。扩展我的客户类时,我没有添加“super(cID,cName,cPhone)。这导致返回null。

class STCustomer extends Customer{
//instance variables
private GregorianCalendar stCustJoinDate; 

//constructor
public STCustomer (String cID, String cName, String cPhone, 
        GregorianCalendar stCJoinDate)
{
    super(cID, cName, cPhone );
    stCustJoinDate = stCJoinDate;
}

//accessor
public GregorianCalendar getSTCJoinDate() {return stCustJoinDate;}