Java 如何在将子类中的对象放入类型为super class的数组后调用subclass方法?

Java 如何在将子类中的对象放入类型为super class的数组后调用subclass方法?,java,Java,我有两个班——“学生”和“员工”,这两个班都扩展到了班级人员。 所有3个类中都有方法。 在我的演示类中,我必须从每个类(Student、Employee和Person)创建2个对象,并将它们放入Person类型的数组中。然后我必须遍历数组,根据对象是来自Student、Employee还是Person,我必须在这个类/子类中调用一个方法。问题是,一旦这些对象进入Person数组,只有类Person中的.methods才可见。如果我的数组[I].“方法”来自学生或员工(数组[I].showStud

我有两个班——“学生”和“员工”,这两个班都扩展到了班级人员。 所有3个类中都有方法。 在我的演示类中,我必须从每个类(Student、Employee和Person)创建2个对象,并将它们放入Person类型的数组中。然后我必须遍历数组,根据对象是来自Student、Employee还是Person,我必须在这个类/子类中调用一个方法。问题是,一旦这些对象进入Person数组,只有类Person中的.methods才可见。如果我的数组[I].“方法”来自学生或员工(数组[I].showStudentInfo()和数组[I].ShowEmployeInfo()),如何才能找到它 提前谢谢你

public class Person {
    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    void showPersonInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }
}

public class Student extends Person {
    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }
    public void showStudentInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }
}

public class Employee extends Person {
double daySallary;
double extraSum;
Employee(String name, int age, boolean isMan, double daySallary){
    super(name, age, isMan);
    this.daySallary=daySallary;
}
    double calculateOvertime(double hours) {
        if (this.age< 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }
    public void showEmployeeInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}

public class Demo {
    public static void main(String[] args) {
        Person ivan = new Person("Ivan Georgiev", 27, true);
        Person nikola = new Person("Nikola Ivanov", 30, true);
        Student iskra = new Student("Iskra Dimitrova", 21, false, 4.5);
        Student georgi = new Student("Georgi Kazakov", 19, true, 5.5);
        Employee neli = new Employee("Anelia Stoicheva", 35, false, 50);
        Employee monika = new Employee("Monika Petrova", 42, false, 80);

        Person[] array = new Person[10];
        array[0] = ivan;
        array[1] = nikola;
        array[2] = iskra;
        array[3] = georgi;
        array[4] = neli;
        array[5] = monika;


        for (int i = 0; i < 6; i++) {
            if (array[i].getClass().equals(ivan.getClass())) {
                array[i].showPersonInfo();
            }
            if (array[i].getClass().equals(iskra.getClass())) {

                array[i].showStudentInfo();
            }
            if (array[i].getClass().equals(neli.getClass())) {

                array[i].showEmployeeInfo();
            }
        }
公共类人物{
字符串名;
智力年龄;
布尔伊斯曼;
Person(字符串名称、整数年龄、布尔isMan){
this.name=名称;
这个。年龄=年龄;
this.isMan=isMan;
}
void showPersonInfo(){
System.out.println(“|カ:”+this.name+“カ”+“+this.age+“カ”+“+this.isMan”);
}
}
公营班级学生人数{
双倍得分;
学生(字符串名、整数、布尔isMan、双倍分数){
超级(姓名、年龄、isMan);
这个分数=分数;
}
公共空间显示学生信息(){
System.out.println(“|カ:”+super.name+“カ”+“Γカカカ:”+super.age+“カ”+“Мъжカ”
+super.isMan+“|”+“öццаа”(+this.score);
}
}
公共类雇员扩展个人{
双日制;
双倍外加费;
Employee(字符串名称、整数年龄、布尔isMan、双daySallary){
超级(姓名、年龄、isMan);
this.daySallary=daySallary;
}
双倍计算时间(双倍小时){
如果(该年龄<18岁)
外和=0;
其他的
额外费用=(this.daySallary/8)*小时*1.5;
返回额外金额;
}
public void showEmployeeInfo(){
System.out.println(“|カ:”+super.name+“カ”+“Γカカカ:”+super.age+“カ”+“Мъжカ”
+super.isMan+“|”+“此项额外费用);
}
}
公开课演示{
公共静态void main(字符串[]args){
人物伊万=新人(“伊万·乔治耶夫”,27岁,真实);
人物尼古拉=新人(“尼古拉·伊万诺夫”,30岁,真实);
学生iskra=新学生(“iskra Dimitrova”,21,假,4.5);
学生georgi=新生(“georgi Kazakov”,19,正确,5.5);
员工neli=新员工(“Anelia Stoicheva”,35,假,50);
员工monika=新员工(“monika Petrova”,42,假,80);
Person[]数组=新的Person[10];
数组[0]=ivan;
数组[1]=尼古拉;
数组[2]=iskra;
数组[3]=georgi;
数组[4]=neli;
数组[5]=monika;
对于(int i=0;i<6;i++){
if(数组[i].getClass().equals(ivan.getClass())){
数组[i].showPersonInfo();
}
if(数组[i].getClass().equals(iskra.getClass())){
数组[i]。showStudentInfo();
}
if(数组[i].getClass().equals(neli.getClass())){
数组[i].showEmployeeInfo();
}
}

在您的情况下,由于您已经确认在循环的每个迭代过程中所处理的
人员的类型,您可以根据需要将
人员
强制转换为
员工
学生

if (array[i].getClass().equals(iskra.getClass())) {
    ((Student)array[i]).showStudentInfo();
}

但是,更好的办法是遵循更标准的面向对象编程模型。因为从
Person
扩展的所有类都有一个显示信息的方法,所以您应该在
Person
类中声明该方法,并让子类重写它

通过在
Person
类中声明
showInfo()
方法,您可以确保无论您使用的是哪种
Person
循环都可以访问该方法


人员类别:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}
学生班:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}
员工类别:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}

在您的情况下,由于您已经确认在循环的每次迭代期间您正在处理的
人员的类型,您可以根据需要将
人员
强制转换为
员工
学生

if (array[i].getClass().equals(iskra.getClass())) {
    ((Student)array[i]).showStudentInfo();
}

但是,更好的办法是遵循更标准的面向对象编程模型。因为从
Person
扩展的所有类都有一个显示信息的方法,所以您应该在
Person
类中声明该方法,并让子类重写它

通过在
Person
类中声明
showInfo()
方法,您可以确保无论您使用的是哪种
Person
循环都可以访问该方法


人员类别:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}
学生班:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}
员工类别:

public class Person {

    String name;
    int age;
    boolean isMan;

    Person(String name, int age, boolean isMan) {
        this.name = name;
        this.age = age;
        this.isMan = isMan;
    }

    public void showInfo() {
        System.out.println("Име: " + this.name + " | " + "години: " + this.age + " | " + "мъж ли е: " + this.isMan);
    }

    // SETTERS and GETTERS
}
public class Student extends Person {

    double score;

    Student(String name, int age, boolean isMan, double score) {
        super(name, age, isMan);
        this.score = score;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Оценка: " + this.score);
    }

    // SETTERS and GETTERS
}
public class Employee extends Person {

    double daySallary;
    double extraSum;

    Employee(String name, int age, boolean isMan, double daySallary) {
        super(name, age, isMan);
        this.daySallary = daySallary;
    }

    double calculateOvertime(double hours) {
        if (this.age < 18)
            extraSum = 0;
        else
            extraSum = (this.daySallary / 8) * hours * 1.5;
        return extraSum;
    }

    @Override
    public void showInfo() {
        System.out.println("Име: " + super.name + " | " + "години: " + super.age + " | " + "мъж ли е: " + " | "
                + super.isMan + " | " + "Допълнителна сума от оставане след работно време: " + this.extraSum);
    }
}

如果您知道正在使用的
人的类型,则可以将对象强制转换为正确的类型:
((学生)数组[i])。showStudentInfo()
如果您有
声明一个简单的
showInfo(),则您的设计可能会更好
方法并在子类中重写它。从OOP的角度使用
instanceOf
或更好的方法将
showInfo
方法添加并抽象到超类,并在数组的每个元素上调用它。如果您知道正在处理的
Person
的类型,则可以将对象强制转换为正确的类型:
((学生)数组[i])。showStudentInfo()
但是,如果您有
Person
声明一个简单的
showInfo()
方法并在子类中重写它,您的设计可能会更好