如果创建父类的数组,如何通过数组对象从子类访问方法?
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[] studentArray
。 studentArray
中的一些 Student
对象是 AthleticStudent
s,其他不是。您有一个特定的AthleticStudent eva
,它位于studentArray[]
中,假设索引为1,并且您想添加到她的anotherRace()
。您的调用 studentArray[1].anotherRace
无法编译,因为编译器将该元素视为 Student
而不是 AthleticStudent
。
诀窍是将元素转换为AthleticStudent
。我省略了真正成为AthleticStudent
的元素的测试;你必须在你的代码中做那个测试。
((AthleticStudent) studentArray[1]).anotherRace();
【讨论】:
我为造成的混乱道歉。我现在才开始学习编程,而且我还在习惯 Java 中的大小写规则,因为我以前只使用过 Delphi。下次我会尽量多注意它。你解释它的方式很有意义,我的代码现在可以工作了。非常感谢!以上是关于如果创建父类的数组,如何通过数组对象从子类访问方法?的主要内容,如果未能解决你的问题,请参考以下文章