如果创建父类的数组,如何通过数组对象从子类访问方法?

Posted

技术标签:

【中文标题】如果创建父类的数组,如何通过数组对象从子类访问方法?【英文标题】:If I create an array of the parental class, how do I access a method from the sub class through the array object? 【发布时间】:2019-08-07 18:16:00 【问题描述】:

我正在使用一个程序来帮助我练习我的编码技能。该程序有以下场景:有一个20名学生的教室,其中记录了学生的姓名和年龄。这些学生中有一半参加了学校的体育运动。在这里,记录了他们完成的比赛和赢得的比赛。 在这个程序中,我有三个类:

    runStudents - 带主方法的类 学生(字符串姓名、字符串姓氏、整数年龄)- 家长班 AthleticStudents(字符串名称、字符串姓氏、整数年龄、整数种族、整数胜利)- 子类

用户应该能够向对象添加另一场比赛(并获胜)。如提供的代码所示,创建了一个数组来存储 20 个学生对象。我必须能够访问一个方法来更改数组中的对象,但这个方法不在父类中(创建对象的类。

public class Students

    private String name;
    private String surname;
    private int age;

    public Students()
       
    

    public Students(String name, String surname, int age)
    
        this.name = name;
        this.surname = surname;
        this.age = age;
    

    public String getName()
    
        return this.name;
    

    public String getSurname()
    
        return this.surname;
    

    public double getAge()
    
        return this.age;
    

    public void setName(String name)
    
        this.name = name;
    

    public void setSurname(String surname)
    
        this.surname = surname;
    

    public void setAge(int age)
    
        this.age = age;
    

    public String toString()
    
        return String.format("name\t\t: %s\nsurname\t\t: %s\nage\t\t: %s", 
        this.name, this.surname, this.age);
    


public class AthleticStudents extends Students

    private int races;
    private int victories;

    public AthleticStudents()
    

    

    public AthleticStudents(String name, String surname, int age, int 
        races, int victories)
    
        super(name, surname, age);
        this.races = races;
        this.victories = victories;
    

    public int getRaces()
    
        return this.races;
    

    public int getVictories()
    
        return this.victories;
    

    public void setRaces(int races)
    
        this.races = races;
    

    public void setVictories(int victories)
    
        this.victories = victories;
        

    public void anotherRace()
    
        this.races = this.races + 1;
       

    public void anotherWin()
    
        this.victories = this.victories + 1;
    

    public String toString()
    
        return super.toString() + String.format("\nnumber of races\t: 
        %s\nnumber of wins\t: %s", this.races, this.victories);
    


public class runStudents

    public static void main(String[]args)
    
        Students[] myStudents = new Students[20];

        myStudents[0] = new Students("John", "Richards", 15);
        myStudents[1] = new AthleticStudents("Eva", "Grey", 14, 3, 1);
        myStudents[2] = new Students("Lena", "Brie", 15);


        for (int i = 0; i < 3; i++)
            System.out.println(myStudents[i].toString() + "\n\n");
    

我希望能够做到以下几点:

AthleticStudents[1].anotherRace();

但不能这样做,因为数组对象是从父类派生的,我在子类中声明了该方法。如何将两者联系起来?

【问题讨论】:

类名应该是单数形式,并且用PascalCase写。 【参考方案1】:

我假设您创建了一个父类实例的数组。只需以这种方式转换实例(您最好检查元素是否是子类的实例):

if (AthleticStudents[1] instanceof AthleticStudents) 
   ((AthleticStudents) AthleticStudents[1]).anotherRace();

【讨论】:

非常感谢!我会考虑的。【参考方案2】:

我不确定这是否正是您正在寻找的,但它对我来说效果很好。不要像那样尝试访问 AthleticStudents 方法 anotherRace() ,而是在你的 main 方法中尝试这个。

Students[] myStudents = new Students[20];

        myStudents[0] = new Students("John", "Richards", 15);
        myStudents[1] = new AthleticStudents("Eva", "Grey", 14, 3, 1);
        myStudents[2] = new Students("Lena", "Brie", 15);

        AthleticStudents addRace= (AthleticStudents)myStudents[1];
        addRace.anotherRace(); //This will increment Eva's race count to 4

        for (int i = 0; i < 3; i++)
            System.out.println(myStudents[i].toString() + "\n\n");

我所做的只是将元素转换为名为“addRace”的对象 AthleticStudents。通过将 myStudents[1] 转换为这个新对象,您可以访问所有 AthleticStudents 方法。

我刚刚看到发布的另一个答案也同样有效!

希望这会有所帮助!

【讨论】:

非常感谢您的帮助,非常感谢!【参考方案3】:

我不确定我是否理解您的问题,因为您的大小写有点不一致。 runStudents 是一个类,而 AthleticStudents 既是一个类又是一个数组。不过我会试试的。

如果我确实理解了您的问题,那么您有一个数组 Student[] studentArraystudentArray 中的一些 Student 对象是 AthleticStudents,其他不是。您有一个特定的AthleticStudent eva,它位于studentArray[] 中,假设索引为1,并且您想添加到她的anotherRace()。您的调用 studentArray[1].anotherRace 无法编译,因为编译器将该元素视为 Student 而不是 AthleticStudent

诀窍是将元素转换为AthleticStudent。我省略了真正成为AthleticStudent的元素的测试;你必须在你的代码中做那个测试。

((AthleticStudent) studentArray[1]).anotherRace();

【讨论】:

我为造成的混乱道歉。我现在才开始学习编程,而且我还在习惯 Java 中的大小写规则,因为我以前只使用过 Delphi。下次我会尽量多注意它。你解释它的方式很有意义,我的代码现在可以工作了。非常感谢!

以上是关于如果创建父类的数组,如何通过数组对象从子类访问方法?的主要内容,如果未能解决你的问题,请参考以下文章

通过反射访问父类的私有成员

子类构造函数

如何在java中子类中父类的对象如何调用父类的方法?

关于protected在子类创建父类对象无法访问父类protected方法或成员

在java语言里如何在子类中调用父类的有参构造函数

java(面向对象)中,子类如何调用父类的构造方法?分别从无参和有参角度