2017-09-02 11 views
3

とサブクラス変数を使用する方法:基本的なJava継承/配列。このmainメソッドで配列

package practice; 

public class PersonTest { 

    public static void main(String[] args) 
    { 
     Person[] people = new Person[2]; 

     people[0] = new Person(); 
     people[1] = new Employee(); 

     System.out.println(people[1].job); 
    } 
} 

私は仕事を使用しようとすると、私は、コンパイラのエラーを取得します。なぜ誰に教えてもらえますか?

Personクラス:

package practice; 

public class Person{ 
    String name; 
    int age; 
    public Person() { 
     this.name = "undefined"; 
     this.age = 0; 
    } 
} 

そして、Employeeクラス:以下は、私は上記の方法のために作成したクラスがある

package practice; 

public class Employee extends Person{ 
    String job; 
    Employee() { 
     super(); 
     this.job = "job"; 
    } 
} 

答えて

5

シンプル:コンパイル時間その配列についての知識は:のオブジェクトです。

Person[] people = new Person[2]; 

コンパイラは、配列スロットのいずれかに従業員オブジェクトを置くことを決めたことを気にしません。

そのようなアレイで人と従業員のオブジェクトを置くことは完全に罰金です - しかし、あなたは従業員の特定のものを必要とするとき、あなたのようなものだろう:

if (people[i] instanceof Employee) { 
System.out.println(((Employee) people[i]). job) 

あなたはのためのバスを持っていると仮定します。あなたのアイデアは、そのバスに座っている誰もが従業員だということです。いいえ - それは人のバスのバスです - あなたは彼らの性質について尋ねるまで、あなたはそこに座っている個人について知りません。

+1

週末でも作業します! – davidxxx

+0

*人のためのバスがあるとします。*これと私の間には大きな違いがあります:) – nullpointer

+1

@davidxxx SOは物事の趣味の面でより多くです。私はそれらの答えを書いた後、私はいくつかの古い農家をきれいにして、一週間中に私の配偶者が "準備した"ゴミ箱に容器全体を満たしました。それは*仕事* ;-)でした – GhostCat

3

あなたが明示的にオブジェクトをキャストし、

System.out.println(people[1].job); 
を変更することができます

として:

System.out.println(((Employee) people[1]).job); 
1

jobは、PersonではなくEmployee Classのメンバ変数です。したがって、 にアクセスするには、Employeeに明示的にキャストする必要があります。

((Employee) people[1]).job 
0

あなたにみんなありがとう。それは私の質問に答えます。そのような方法にキャストする必要がないという事実は私を投げていると私は思う。

関連する問題