2016-11-15 66 views
-1

我無法讓我的程序中的子類的setter和getters的數組。Java超類,子類和數組。繼承的子類方法沒有顯示在數組中

我有主類Person,子類SchoolEmployee,以及繼承字段SchoolEmployee(其繼承了Person類字段)兩個子類。

我創建了一個測試文件,以檢查是否一切正常,但它似乎只能夠給我的Person類的方法。

例如,我創建的數組:

Person[] schoolemployees = new Person[4]; 

然後,我接着使用I用於每個類別所作的構造把值陣列中:

schoolemployees[0] = new Teacher(FirstNameHere, SecondName, etc...); 
schoolemployees[1] = new Teacher(FirstNameHere, SecondName, etc...); 
schoolemployees[2] = new Office(FirstNameHere, SecondName, etc...); 
schoolemployees[2] = new Office(FirstNameHere, SecondName, etc...); 

我的問題是,我我只能從Person類中設置/獲取字段和調用方法。

例如:

input = JOptionPane.showInputDialog(null, "Enter name for first name"); 
schoolemployees[1].setFirstName(input); 

當我嘗試設置/獲取的字段或呼叫子類中的方法,就不會顯示在所有。

可能有人請提供一些洞察爲什麼我無法看到數組中的繼承的字段?謝謝。

+3

繼承訪問它意味着'SchoolEmployee'將對'Person',而不是相反所有成員。 – shmosel

回答

2

你的陣列的類型是Person[]。這意味着編譯器知道每個元素是Person(或null)。它無法知道schoolemployees[1]Teacher的方式,所以它不會讓你訪問比通用於所有Person之外的其他領域或方法。

  1. 如果所有Person應該有一個setFirstName,那麼你可以聲明爲它的人一個抽象的(甚至是具體的)方法。

  2. 如果您確定給定的數組條目是Teacher,您可以輸入:Teacher t = (Teacher)schoolemployees[1];。然後你可以打電話給t。但是當這個人變成不是教師時,你會得到一個例外。

  3. 也許你希望你的陣列是SchoolEmployee[]代替(該類似乎有你的方法)。

+0

只有方法#3不能工作的是,如果「辦公室」或「教師」有一種方法,其他方法則不然,那麼OP將需要適當地施放,如在#2中。很好的答案。 –

+0

非常感謝你!我可以使用類型轉換從子類調用其他方法! – Maximilious

0

我想你的問題,有一種方法。你可以製作抽象的人物。並繼承了SchoolEmployee。你定義相同的方法,通常你的意見,例如setName(String str),因爲所有的對象都得到了名字。和您拓展功能

0

它發生,因爲你正在使用Person類的引用,以便編譯時方法調用過程中會從Person類來解決。例如

class Person { 
    private String firstName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

class Student extends Person { 
    private String ClassName; 

    public String getClassName() { 
     return ClassName; 
    } 

    public void setClassName(String className) { 
     ClassName = className; 
    } 
} 

,你在下面的方式

Student student = new Student(); 
student.setFirstName("Naresh"); 
student.setClassName("Highschool"); 


// For compiler person is Person (at runtime it will be resolved to object of Student class), and person class doesn't have setClassName() defined in it compiler will give an error while accessing it 
Person person = new Student(); 
person.setFirstName("Naresh"); 

// Compilation error here because setClassName() is not accessible from Person 
person.setClassName("Highschool");