在main中调用子类的方法

时间:2014-07-17 23:05:38

标签: java object

我有一个名为“学生”的班级作为家长和2个子班级(本科和研究生)......

    Student[] student;
    student=new Student[10];

我需要在子类内的数组中设置值..

所以我的问题是如何从主要方法调用该方法?

这是我想要调用的方法

public void setInternship(boolean Internship){
    this.Internship=Internship;}

及其内部本科班级

5 个答案:

答案 0 :(得分:1)

通常,如果您有一个公共基类,并且想要提供属于所有子类的不同特定功能,则应使用接口或抽象方法,例如:

abstract class Student {
  abstract void setInternship(boolean internship);
}

class Undergraduate {
  void setInternship(boolean internship) { this.internship = internship; }
}

情况并非总是如此,因为您可能会遇到只有某些子类能够响应特定功能的情况,在这种情况下您有两种选择:

  • 在隐式upcast到其基类
  • 之前调用实例上的方法
  • 使用明确的向下转换,这会打破类型安全,应该在没有必要时予以避免

第一种情况很简单:

Undergraduate ud = new Undergraduate();
ud.setInternship(true);
students[0] = ud;

第二种情况也很简单:

students[0] = new Undergraduate();
((Undegraduate)students[0]).setInternship(true);

将类型转换为另一个类型,不允许输入类型,将在运行时引发ClassCastException。为避免这种情况,您可以使用instanceof运算符:

if (students[0] instanceof Undergraduate)
  ((Undegraduate)students[0]).setInternship(true);

答案 1 :(得分:0)

如果您知道数组中的特定Student实际上是Undergraduate,那么您可以将其投射:

student[0] = new Undergraduate(...);
Undergraduate undergraduate = (Undergraduate)student[0];  // This is the cast
undergraduate.setInternship(internship);

答案 2 :(得分:0)

如果你有本科生和研究生的数组,你可以遍历数组,检查该数组的索引位置是否包含本科课程的实例,然后调用该方法。

答案 3 :(得分:0)

为了能够调用子类的方法,实际的对象必须是该子类。例如,您将拥有:

Student[] students = new Students[1];
students[0] = new Undergraduate();
((Undergraduate))students[0]).setInternship(new Internship());

或者如果你有一个更大的数组而不知道对象的实际类型,你必须在类型之前检查以避免ClassCastException

for (int i = 0; i < students.length; ++i) {
    if (students[i] instanceof Undergraduate) {
        ((Undergraduate)students[i]).setInternship(new Internship());
    }
}

答案 4 :(得分:0)

您尝试初始化“实习”的字段对于基类“学生”不可见。要初始化子类(“本科”)字段,您需要输入“学生”类型的对象到“本科生”

Student[] student;
student=new Student[10];
((UnderGraduate)student).setInternship(true);

我不知道你的用例,但理想情况下你的设计应该是这样的,即父母班级应该对儿童班的领域一无所知,所以在你的情况下,学生班不应该知道“本科和研究生”中的字段< / p>

理想情况下,学生的所有属性,例如姓名,年龄,DOB等应与学生班一起使用,您应该将本科和研究生的特定属性添加到各自的班级。

希望这有帮助。