Runnable和Thread抽象类吗?

use*_*223 -1 java oop class runnable

这个问题可能很愚蠢,我对Java和面向对象编程都很陌生.现在,我正在学习我的学期考试,我有这个问题:是RunnableThread抽象课吗?

T.J*_*der 7

一个抽象类是与一个或多个抽象方法(或这仅仅是任意使用标记的抽象类abstract关键字).使用抽象类,您无法创建实例; 你必须从类中派生(派生),实现任何抽象方法,然后创建子类的实例.本教程中的更多内容.

Runnable是一个接口,因此不是Java意义上的抽象类.然而:

  • 在更一般的计算机科学/ OOP意义上,你可以说Java接口是一个抽象类,因为它像抽象类一样定义了一个契约,但你不能直接实例化它,你必须实现它.它不是 Java意义上的一个,但对于一般情况有一个论点.

  • 在Java 8中(尽管Runnable不这样做),现在可以使用方法的"默认"实现来定义接口,这使得这些接口和Java的普通抽象类之间的区别非常微妙.(剩下的区别与继承有关;你不能从Java中的多个类继承,但你可以从一个类和任意数量的接口继承,甚至是使用默认方法的接口.)但是,Runnable同样没有默认方法.

Thread是一个没有标记的类,abstract没有abstract方法,因此可以直接实例化.所以它也不是Java或一般CS意义上的抽象类.然而:

  • 有点像一个抽象类,尽管它不是字面上的一个,因为Thread只有当你将它子类化并覆盖它的run方法时才有用,或者(如果你通常首选的话)编写一个实现该Runnable实例的类并将其实例传递给该Thread构造函数.本教程中的更多内容.

  • 从CS理论的角度来看,Java`interface`是一个纯粹的抽象类.一般来说,一个应该**不**子类`Thread`,恕我直言,如果你不**子类,它是最有用的. (2认同)
  • @MarkRotteveel我认为保罗格雷厄姆说得最好,"_a a_是一种比__更强大的关系." `Thread`构造函数的`Runnable`参数是一个"委托".也就是说,一个Thread _has a_ Runnable.每当你发现自己想要创建一个子类系列时,你应该停下来问:"我可以使用接口和代理来实现这一点吗?" 答案通常是"是",如果你与代表一起做,你的代码可能更容易理解,更容易测试,更容易维护. (2认同)