可运行接口实例化

Runnable interface instantiation

我正在阅读 Head first 这本书 java 并且正在阅读有关线程的内容并开始了解 Runnable 接口。现在我们知道接口不能直接实例化。它的成员由实现接口的任何 class 实现,但下面的代码让我头疼。书中声明了Runnable接口的实例,并赋值了runnable接口的实现对象class。

public class MyRunnable implements Runnable {
   public void main() {
        go();
   }
   public void go() {
        doMore();
   }
   public void doMore() {
     System.out.println("top of the stack");
   }
}

class ThreadTester {
   public static void main(String[] args) {
      Runnable threadJob = new MyRunnable();
      Thread myThread = new Thread(threadJob);
      myThread.start();
      System.out.println("back in pain");
  }
}

我无法理解 Runnable threadJob = new MyRunnable(); 行。接口在不允许时如何被实例化。为什么不能像 MyRunnable threadJob = new MyRunnable(); 这样的行。我的意思是 MyRunnable class 通过了 Runnable 接口的 IS-A 测试,所以作者为什么选择前一个语句。那是我在这里缺少的东西吗?请帮我解释一下。

Now we know an interface can't be instantiated directly.

您没有直接实例化 Runnable 接口。

希望您同意以下内容应该有效:

MyRunnable threadJob = new MyRunnable();
Runnable runnable = threadJob; // since threadJob is a Runnable

那为什么那条线不起作用?

当我们说你不能直接实例化一个接口,意思是你不能写

Runnable runnable = new Runnable();

这是唯一不起作用的东西。

在 OOP 中称为多态性。
它说你可以从 classB 实例化(假设 ClassBClassA 的子 class)用 ClassA 类型定义变量,然后从 ClassB 并将其分配给该变量。
例如在 java 中对象 class 是任何 classes 的根所以你可以像下面那样做:

Object x = new YourClass();

或者如果例如你的 class implements InterfaceA 你可以像这里那样做:

InterfaceA x = new YourClass();