2012-03-09 18 views
4

私は継承と多型を使いこなしています。私がタイプの従業員(私のスーパークラス)の配列を作らなければならなかったテスターに​​着くまで、すべてがうまくいっていました。現在このプログラムを実行しようとすると、このエラーが表示されます。私はemployeeArray =ヌル;.を持って宣言するとき、私はこれはとは何かを持っていると仮定しているスレッド「メイン」のjava.lang.NullPointerExceptionカスタムタイプの配列を初期化する

例外しかし、それを残しておくと、各従業員を配列に入れることに間違いがあります。従業員配列は初期化されなければならず、デフォルトでemployeeArray = null;を含める必要があります。私がjava上に持っている本は、これらの種類の配列には本当に触れていません。そして、私は、オンラインで自分のトラブルに対する答えを見つけるのに困っています。誰でも助けることができれば幸いです。

私もこの

Employee [] employeeArray = new Employee[3] ; 

のようなものを試してみましたこれは、すべてのエラーを返しませんでしたが、私は全く探していたものを返しませんでした。それは私が必要とするものにもっと似ていますか?スーパークラスとサブクラスで問題がありますか?

public class EmployeeTest { 

public static void main(String[] args){ 

Employee [] employeeArray = null; 
SalariedEmployee employee1 = new SalariedEmployee("Esther", "Smith", "111-111-111", 6, 2011, 2400); 
CommissionedEmployee employee2 = new CommissionedEmployee("Nick", "McRae", "222-222-222", 1, 1998, 50000, 0.1); 
SalPlusCommEmployee employee3 = new SalPlusCommEmployee("Dan", "Mills", "333-333-333", 3, 2011, 1000, 0.05, 500); 

employeeArray[0] = employee1; 
employeeArray[1] = employee2; 
employeeArray[2] = employee3; 

System.out.println(employeeArray[0].getEmployeeDetails); 

System.out.println(employee1.toString()); // call the method from the sub class SalariedEmployee 
System.out.println(employee2.toString()); // call the method from the sub class CommissionedEmployee 
System.out.println(employee3.toString()); // call the method from the sub class SalPlusCommEmployee 
} 
+1

「Employee [] employeeArray = new Employee [3];はあなたの必要とするものです。 「私が探していたものを返さなかった」とはどういう意味ですか? –

+0

サブクラスを返していて、それはいくつかの16進数のように見えます。 SalariedEmployee @ a90653 CommissionedEmployee @ de6ced SalPlusCommEmployee @ c17164私が取得しています何です。私は、名前、SIN、開始日などの従業員を宣言するときに見ることができる情報のゲッターとステッターを持っています。私はすべての情報を返そうとしていました。正直言って私はちょうど継承で始まっているので、私は以前に間違いを犯している可能性が高いです。配列を稼働させようとすると、たくさんのthigsが変更されました。 – Sh0gun

+0

super-classまたはsupper-interfaceで配列を初期化すると、その配列に新しいオブジェクトを追加する柔軟性が増します。 – simaremare

答えて

7

あなたは

Employee [] employeeArray = new Employee[3];

を使用するだけでなく、employeeArray[0].getEmployeeDetails()

の終わりにしかし、あなたの場合には括弧を追加する必要がある、あなたは、配列を使用して心配する必要はありません。サイズを指定する場合は、代わりにArrayListを使用できます。

ArrayList<Employee> employees = new ArrayList<Employee>(); 
employees.add(new SalariedEmployee(...)); 
employees.add(new CommissionnedEmployee(...)); 
... 
あなたは出力に含まになりたいものは何でもして

従業員にtoString()を呼び出すために、あなたがプロパティに必要とEmployeeクラスのためのtoString()メソッドをオーバーライドし、そうでなければ、出力ObjectクラスのデフォルトtoString()を取得しますクラス名、およびオブジェクトのハッシュコードの16進表現を返します。

あなたのEmployeeクラスは、(それのようなもの)は、このメソッドを持っている必要があります。

public String toString() { 
    return this.name + " " + this.firstName ...; 
} 
+0

getEmployeeDetailsは何らかの種類のパブリック変数ですが、メソッド呼び出しのように聞こえます。 – Dan675

+0

すばらしかった、とても役に立ちました。ありがとう、今私は、従業員の詳細を探しているときにすべてのnullsを取得しています。うまくいけば、これはより簡単な修正になります。再度、感謝します! – Sh0gun

0

あなた

Employee [] employeeArray = null; 

がNULLポインタを引き起こす可能性があり、あなたは、配列を特定する必要があります、。 これを追加する

employeeArray = new Employee[3]; 

その行の後。 SalariedEmployee、CommissionedEmployeeが従業員のサブクラスである場合、問題はありません。

0

このコードは機能しますので、クラスを確認してください。

public static void main(String[] args) { 

    Object[] objets = new Object[3]; 

    String s1 = new String("s1"); 

    String s2 = new String("s2"); 

    String s3 = new String("s3"); 

    objets[0] = s1; 
    objets[1] = s2; 
    objets[2] = s3; 

    System.out.println(Arrays.asList(objets)); 

}