希望有人能够帮助我,或指出我正确的方向。 我有一个包含许多条目的文本文件
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];
答案 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感到满意。您可以使用它的add
和size
方法,而不必自己跟踪大小。您还可以拥有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;}