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

标签 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() {
    
}

但是如果我把它留空什么也不会发生。基本上我试图以一种简单的方式调用抽象类中的方法,而不需要在每个类中都键入它。

最佳答案

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

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 的单元化值,因为您首先调用父类(super class)的构造函数,它调用了 子类foo 方法.

如果适合您的情况,您可以通过将您的方法设置为 final 来解决此问题。

关于java - 如何正确调用抽象类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34222881/

相关文章:

java - 从 Eclipse 插件运行程序

java - 如何使用computeTax方法计算main中定义的变量的税,然后在main中稍后调用税的值?

c# - 将 "reference type"作为参数传递给具有 'ref' 键的方法是否有意义?

java - 无法运行 OSGI bundle

java - 如何使用包含 Java 命名空间的 XPath 检索 XML 数据?

java - Spring MVC 或其他一些框架支持 URL 中的 .jsp 扩展

c# - 如何为自定义类中的 List<T> 属性创建索引访问器?

java - 什么是类、引用和对象?

c++ - C++难以从深层内部类访问方法

php - 没有属性的对象可以吗?