2011-11-10 143 views
0

希望有人能夠幫助我,或指出我的方向正確。 我有許多條目從抽象和子類創建對象數組java

CUST001,約翰·瓊斯,555 0505的一個文本文件,19/09/1981
CUST002,PeterParker,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)); 
} 

「試圖」 從父(客戶)和子類(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

你可以重命名所有在你的問題中的「常規類」的措辭,要麼說「子類」或「超類」我不知道常規類是什麼。在某些部分,它聽起來像是指超級類別,而在另一些部分,它聽起來像是指的是子類別。 –

+0

嗨喬治,道歉的混亂。我有兩個我創建的課程。一個是具體類,另一個是具有子類的抽象類。我正嘗試使用子類從文本文件創建對象。對具體類(產品)做同樣的事情,可以讓我用txt文件中的值成功創建對象。這就是我所堅持的。看來我失去了一些明顯的東西,因爲我沒有看到其他人遇到這些困難。 – user1031551

回答

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