当前位置: 首页 > 知识库问答 >
问题:

在Java中从构造函数调用抽象方法可以吗?[副本]

尹晟
2023-03-14
public abstract class Base implements Runnable {

  protected int param;

  public Base(final int param) {
      System.out.println("Base constructor");
      this.param = param;
      // I'm using this param here
      new Thread(this).start();
      System.out.println("Derivative thread created with param " + param);
  }

  @Override
  abstract public void run();
}
public class Derivative extends Base {

  public Derivative(final int param) {
      super(param);
  }

  @Override
  public void run() {
      System.out.println("Derivative is running with param " + param);
  }

  public static void main(String[] args) {
      Derivative thread = new Derivative(1);
  }

}

用参数1导数创建的基构造函数导数线程正在用参数1运行

但是在JAVA中启动一个线程调用构造函数中的抽象方法安全吗?因为,就我所知,在C++和C#中,它在大多数情况下是不安全的。谢谢!

共有1个答案

越胤
2023-03-14

以下代码演示了为什么永远不应该从构造函数调用抽象方法或任何其他可重写方法:

abstract class Super {
    Super() {
        doSubStuff();
    }
    abstract void doSubStuff();
}

class Sub extends Super {
    String s = "Hello world";

    void doSubStuff() {
        System.out.println(s);
    }
}

public static void main(String[] args) {
    new Sub();
}

运行时,它打印null。这意味着构造函数中唯一“安全”的方法是private和/或final方法。

另一方面,您的代码实际上并不从构造函数调用抽象方法。相反,您将一个未初始化的对象传递给另一个线程进行处理,这更糟糕,因为您要启动的线程可能被赋予优先级,并在完成初始化之前执行。

 类似资料:
  • 问题内容: 假设我有一个实现Runnable接口的抽象基类。 这是一些派生类之一。 关键是我希望我的基类做一些常规的事情,而不是每次都复制它。实际上,它运行良好,输出始终相同: 基本构造函数使用参数1创建的派生线程使用参数1运行派生 但是在JAVA中启动在构造函数中调用抽象方法的线程是否安全?因为据我所知,在大多数情况下,在C ++和C#中是不安全的。谢谢! 问题答案: 此代码演示了为什么你应该

  • 问题内容: 抽象类可以有构造函数吗? 如果是这样,它将如何使用以及用于什么目的? 问题答案: 是的,抽象类可以具有构造函数。考虑一下: 超类是抽象的,并且具有构造函数。具体的类具有仅对值2进行硬编码的构造函数。具体的类具有允许调用者指定值的构造函数。 抽象构造函数将经常用于强制类约束或不变量,例如设置类所需的最小字段。

  • 问题内容: 我遇到的情况是,在实例化类时,我只想读取配置文件一次。 假设我有一个名为的方法,该方法读取配置并将其放入对象中。当程序需要使用配置值时,它将使用定义键读取对象。我想知道构造函数仅在生命周期中调用一次。我可以将我的方法放入构造函数中,这将使我有一次调用的好处,还是有另一种机制可以这样做? 问题答案: 更好的设计是 工厂设计模式

  • 我是新爪哇,目前正在大学读一门课程。我们使用Java编程早期对象作为课程文献。我有一个关于新对象构造函数的问题。这本书非常明确地指出,“即使这样做是可能的,也不要从构造函数调用方法。” 这是所有的方法吗,句号?我理解从构造函数调用类自己的实例方法的问题。但是帮手方法等? 这可以接受吗?如果没有,我想你不能在构造函数中使用任何Java数学util函数或类似的东西?

  • 问题内容: 编辑: 需要明确的一点是:设计很丑陋并不是事实。关键是,设计在那里,我不得不添加另一个子类,如果我忘记添加的话,该子类将无法按预期工作。所以我只是想知道是否可以将其重新定义为抽象。 我现在正面临一个非常奇怪的继承情况。比方说,我有三个班,,并且还有一堆课,…: 提供抽象方法的抽象类也是如此。是其方法的具体实现的子类。还是重写s方法子集的实现的子类。 现在有子类,并且可能还有其他一些子类

  • 正如我们所知,Java是一种面向对象的语言。在Java中,一切都是对象。我们还知道对象有一些东西(实例变量/字段)和一些事情(方法)。它的安全,我们改变了使用方法,即实例变量的状态;二传手