2017-09-02 19 views
3

子類變量,在此主要方法:基本的java繼承/數組。如何使用數組

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

和僱員類:

package practice; 

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

回答

5

簡單:因爲編譯時間關於那個數組的知識是:它是一個數組個人對象。

Person[] people = new Person[2]; 

編譯器不關心你決定把一個員工對象到陣列插槽。

這是完全沒有把Person和Employee對象在這樣的陣列 - 但是當你需要員工具體的事情,你會做這樣的事情:

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

as:

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

工作是員工類的成員變量而不是人。因此,您需要將其明確投射到Employee中才能訪問它。

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

謝謝大家。這回答了我的問題。我認爲你不需要像這樣的方法投擲就是扔我。