如何正确地调用抽象类中的方法

时间:2015-12-11 11:50:42

标签: java class methods abstract-class

public abstract class Human{
    public String name;
    public int number

    public void getInfo(){
        Name = JOptionPane.showInputDialog("Please enter your name: ");
        money = Double.parseDouble(JOptionPane.showInputDialog("Please enter amount of money .00: "));
    }

    public void displayInfo(){
        JOptionPane.showMessageDialog(null,"Name: "+name+"\n"+
                                           "Number: "+number);
    }
}

public class Student extends Human {

}

public class Teacher extends Human{

}

public class Janitor extends Human{

{

大家好,如果在下面所有3个类中调用方法getInfo()和displayInfo(),我需要帮助。我试过了:

public class Student extends Human{
    public Student(){
          getInfo();
          displayInfo();
    }

它有效,但它会产生一个警告,说“构造函数中有问题的调用”我想这不是最好的方法。

我也尝试过:

@Override
public void getInfo() {

}

但是如果我把它留空则没有任何反应。基本上我试图以简单的方式在抽象类中调用该方法,而不需要在每个类中输入它。

有人可以帮助我!提前谢谢。

3 个答案:

答案 0 :(得分:3)

如前所述,您不应该在构造函数中调用可覆盖的方法,因为如果另一个类重写此方法并调用超类的构造函数,它可能会尝试使用尚未初始化的值,因为overriden方法将是调用。例如:

public class Superclass {
  protected int id;
  protected void foo() {
    System.out.println("Foo in superclass");
  }

  public Superclass() {
    foo();
  }
}

public class Subclass extends Superclass {
  public Subclass(int id) {
    super();
    this.id = id;
  }

  @Override
  protected void foo() {
    System.out.println("Id is " + id);
  }
}

这将打印id的单位化值,因为您首先调用超类的构造函数,该构造函数调用子类foo方法。

如果符合您的情况,您可以通过制作方法final来解决此问题。

答案 1 :(得分:1)

您收到警告,因为良好做法不能在构造函数中调用overridable;因为这些overridable可能会尝试访问尚未初始化的成员变量 (== null)

答案 2 :(得分:0)

您不应该在构造函数中调用可覆盖的函数。检查此link