【问题标题】:creating array of objects from abstract and subclasses java从抽象和子类java创建对象数组
【发布时间】:2011-11-10 00:04:27
【问题描述】:

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

CUST001,约翰·琼斯,555 0505,19/09/1981
CUST002, 彼得帕克, 555 1234, 0.2
CUST003,迈克尔·迈克尔斯,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) 和子类 (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];

【问题讨论】:

  • 您能否将问题中“普通类”的所有措辞重命名为“子类”或“超类”?我不知道普通类是什么。在某些地方,它听起来像是指超类,而在其他地方,它听起来像是指子类。
  • 您好 Georges,为您的困惑道歉。我创建了两个类。一个是具体类,另一个是带有子类的抽象类。我正在尝试使用子类从文本文件创建对象。对具体类 (Product) 执行相同操作使我能够成功地使用 txt 文件中的值创建对象。这就是我所坚持的。看来我错过了一些明显的东西,因为我没有看到其他人有这些困难。

标签: java arrays class object abstract


【解决方案1】:

问题在于您的子类构造函数。您必须显式调用所需的超类构造函数,否则编译器会将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)

【讨论】:

    【解决方案2】:

    不,您不应该使用数组。请改用List&lt;Customer&gt;,并对其简单的 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());
    }
    

    【讨论】:

      【解决方案3】:

      这是我犯的许多错误之一。在扩展我的客户类时,我没有添加“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;}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 2010-10-12
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        相关资源
        最近更新 更多