2011-11-10 13 views
0

誰かが私を助けたり、正しい方向に私を向けることができるかもしれないと願っています。 私は、エントリ抽象クラスとサブクラスからオブジェクトの配列を作成するjava

CUST001、ジョン・ジョーンズ、555 0505、19/09/1981
CUST002、PeterParker、555 1234、0.2
CUST003、マイケル・マイケルズ、555 4321の番号を持つテキストファイルを持っています

19/09/1981
などは、私は、共有のプロパティとサブクラスのコンストラクタとアクセサを持つ抽象スーパークラスを持っています。 私は別のクラスを持ち、コンストラクタとアクセサも持っています。

私は各行を読み込み、 "、"で分割し、これを一時配列に読み込みます。次に私のスーパークラスのプロパティを読み込むために空の配列を作成し、コンストラクタで、私はさまざまなオブジェクトを作成します。

問題私は以下を実行しました: コンストラクタを持つ通常のクラス - この作業は完全です。私はオブジェクトが作成され、そこに存在すると、オブジェクトを印刷します。

私のサブクラスだけど、値null、null、nullを返すだけです 私はスーパークラスとサブクラスに問題があると思います。

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 
} 

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]; 
+0

質問の「通常のクラス」のすべての言葉の名前を「サブクラス」または「スーパークラス」と変更することはできますか?私は正規のクラスが何かを知りません。いくつかの部分では、それはスーパークラスを参照するように聞こえ、他の部分では、サブクラスを参照するように聞こえます。 –

+0

こんにちはジョルジュ、混乱のためにお詫び申し上げます。私は2つのクラスを作成しました。 1つは具象クラスであり、もう1つはサブクラスを持つ抽象クラスです。私は、サブクラスを使用してテキストファイルからオブジェクトを作成しようとしています。具体的なクラス(Product)と同じことをすると、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;} 
関連する問題