【问题标题】:subclass of thread implementing Runnable interface实现 Runnable 接口的线程子类
【发布时间】:2015-08-13 04:00:46
【问题描述】:

这让我很困惑,为什么实现可运行接口的线程子类不会强制我重写 run 方法。基本上,当我创建实现 Runnable 的简单类时,它会强制我重写 run 方法。但是当我将普通类作为线程的子类时,它不再强迫我重写该类。这背后的逻辑是什么?

【问题讨论】:

    标签: java multithreading oop interface runnable


    【解决方案1】:

    当一个非抽象类声明它实现了一个接口时,这意味着该类必须具有该接口定义的每个方法的具体实现,但这些实现方法不必在类中显式,它们可以从超类继承。在这个特定的例子中,java.lang.Thread 有自己的public void run(),子类继承,所以实现Runnable 的 Thread 子类不需要添加自己的覆盖来满足编译器(尽管它可能确实有用)。

    【讨论】:

    • 这是否意味着如果我有一个超类,它的方法与我要在我的简单类中实现的接口的方法同名,编译器不会警告我?
    • @ReubenJaMesAveñoGruta 比同一个name稍微多一点,超类方法要兼容接口,所以同名,同参数类型同顺序,同返回类型(或子类型——如果接口方法返回Object,那么使用返回String的方法实现它是有效的,例如)。
    【解决方案2】:

    这是因为 Thread 本身实现了 run()。

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
    

    默认情况下它什么都不做。如果我们扩展一个线程,我们会实现这个方法,以便它做一些有用的事情

    【讨论】:

    • 这基本上意味着,我已经通过扩展 Thread 类来覆盖它,对吧?它不只是默认显示。
    • 你可以扩展 Thread 但不这并不意味着你已经覆盖了 run()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多