2016-11-15 17 views
-1

私のプログラムでサブクラスのセッターとゲッターを与える配列を取得するのに問題があります。Javaのスーパークラス、サブクラス、および配列。配列に表示されないサブクラスのメソッドを継承する

Iは、メインクラスPerson、サブクラスSchoolEmployee、及び(Personクラスからフィールドを継承)SchoolEmployeeからフィールドを継承する2つのサブクラスを有します。

すべてが機能しているかどうかを確認するためのテストファイルを作成しましたが、Personクラスのメソッドしか提供できないようです。

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[] schoolemployees = new Person[4]; 

は例えば、私は配列を作成しました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. すべてPersonsetFirstNameを持つべきであるならば、あなたはそれのために人の抽象的(あるいはコンクリート)メソッドを宣言することができます。

  2. 特定の配列エントリがTeacherであることが確かである場合は、Teacher t = (Teacher)schoolemployees[1];を型キャストできます。その後、tで教師の方法を呼び出すことができます。しかし、この人が教師ではないことが判明したときに例外が発生します。

  3. 配列をSchoolEmployee[](代わりにあなたのメソッドを持つように思われる)にしたいと思うかもしれません。

+0

第3の方法ではうまくいかないのは、「オフィス」または「教師」のいずれかが他の方法ではない場合、OPは#2のように適切にキャストする必要があることです。素晴らしい答え。 –

+0

ありがとうございました!私は型キャストを使ってサブクラスから他のメソッドを呼び出すことができました! – Maximilious

0

私はあなたの問題について考えていますが、1つの方法があります。人の抽象クラスを作ることができます。 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"); 
関連する問題