为什么 abstract 属性 在 Runnable 接口的子类中丢失了?

why abstract property is lost in a subclass of Runnable interface?

我其实是在学习Threads。但是遇到一个非常基本的问题。我知道如果我在我的 class 中继承一个接口,我必须在我继承的 class 中给出所有方法(在该接口中提到的)的定义,否则它必须被声明为抽象的。现在我尝试了非常简单的代码...

import java.util.*;
import java.lang.*;
import java.io.*;


abstract class Code implements Runnable 
{
    public static void main (String[] args) throws java.lang.Exception
    {

    }
}

编译没有问题,然后我把class代码中的abstract关键字去掉,就提示编译错误,说class代码不抽象。 ..

肯定有错误。但是后来我做了什么,检查了一些变化,也从 class 扩展了 Thread class 并重新编译了代码。而且我没有编译错误!虽然我没有给出 run() 方法的定义,但我也没有提到我的 class 是抽象的。 那里...

 class Code extends Thread implements Runnable 
{
    public static void main (String[] args) throws java.lang.Exception
    {

    }
}

表示这个class丢失了摘要属性。这怎么可能?有没有人解释一下。

抽象 class 不必实现接口中的所有方法。当您删除 'abstract' 时,Runnable class 已实现 运行 方法

@Override
public void run() {
    // TODO Auto-generated method stub

}

嗯,你知道 Runnable 接口只有一个抽象方法。即,

abstract public void run();

如果您要实现 Runnable,则必须在您自己的具体 class 中提供 运行() 方法的定义,或者您可以将 class 抽象化。现在,您可以在 class 中显式地提供 运行() 方法的定义,或者通过继承具有 运行() 方法的有效定义的任何其他 class 来隐式地提供。线程 class 还具有 运行() 方法的有效定义。所以,如果你在你的 class 中同时继承 Thread class 和 Runnable 接口,那 class 不再携带任何抽象 property.that 这就是你没有得到编译的原因 error.Make 确定 运行() 方法的访问说明符。如果你继承任何其他 class 而不是 Thread 你必须在那里提供具体的 运行() 方法,

public void run()
 {
    //body
 }

Runnable 是一个接口,它需要任何实现它的 class 来实现 run() 方法

public class A implements Runnable {
    public void run() {
        // implementation of run
    }
}

Thread 是实现 Runnable 接口的具体 class。这意味着它已经具体实现了run()方法。

public class Thread implements Runnable {
    public void run() {
        // Java's implementation of run
        // for the Thread class
    }
}

当您定义扩展 Thread 的 class 时,这意味着它将扩展 Thread class,它已经实现了 [=13] 所需的一切=] 界面。所以你不需要实现 run() 方法。但是,您可以 override 来自 Thread 的实现,并在需要时选择性地调用它。

class A extends Thread {
    @Override
    public void run() {
        // implementation of run
        // optionally call super.run();
    }
}

java.lang.Thread 已经实现了 Runnable 接口并定义了 run 方法。因此,当您扩展 Thread 时,您已经拥有实现 Runnable 所需的一切。如果愿意,您可以使用自己的定义覆盖 run 方法。但是你不需要,如果Thread自己的实现可以满足你的需求。

如前所述,Runnable is an interface containing just one method, run(),正如您所指出的那样抽象。如果您要实现接口:

class A implements Runnable {
   ...
}

编译器会报错:Class A must be either declared abstract or implement abstract method 'run()' in 'Runnable',所以根据报错提示你可以选择实现方法:

class A implements Runnable {
  public void run() {
     ...
  }
}

或将class设为摘要:

abstract class A implements Runnable {
}

任何解决方案都会满足编译器的要求。另一种解决方案是使 A 也成为一个接口:

interface A extends Runnable {
}

一切都取决于你想完成什么。如果您想扩展现有的层次结构但又不想在 A.

中有任何状态,则稍后提供的解决方案将很有用

Runnable 是具有以下声明的接口。

public
interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

当你用 implements Runnable classue 声明你的 class 时,要么你必须实施 运行()方法或将您的 class 声明为抽象

当您的 class 使用以下语句扩展 Thread

class Code extends Thread

Thread class 已经实现了 run() 方法,因此您不会收到编译错误。您可以从下面的语句中删除 implements Runnable,这是多余的。

class Code extends Thread implements Runnable 

看看Thread源代码:

public
class Thread implements Runnable {

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

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