2016-11-15 73 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");