我总是想知道如何通过实现接口,子类获取行为。例如,如果我实现Runnable接口,我的子类开始表现为线程,但是如果我实现接口Runnable中定义的所有方法但不写“实现Runnable”,则子类不表现为Thread。与EventListeners相同。请帮我理解这个行为。
答案 0 :(得分:2)
通过实现接口I,您声明Object“是”I并且它将包含此接口定义的所有方法。如果您只是实现了接口I的方法,但没有通过实现语句声明它,编译器将无法确定您的类“是”是否为“我”并且您将无法将其用作I型。
答案 1 :(得分:1)
不,Runnable
与线程的行为无关。它只包含一个简单,简单,无效的nullary方法,称为“run”。
不指定implements Runnable
只会使您的对象不是Runnable
类型的实例,这意味着您无法将其传递给需要Runnable
的方法。这只是类型安全的问题。您调用的方法也可以接受Object
并使用反射调用run
,但行为完全相同。
答案 2 :(得分:1)
当您实现Runnable
时,您的类不会成为线程,也不会以线程的形式启动行为。但是,如果您的类实现Runnable
,则可以在thread:
class MyClass1 implements Runnable {
public void run() {
// this stuff will run in thread when thread's start() method is called
}
}
new Thread(new MyClass1()).start();
但java是强类型语言。您可以像这样创建类:
class MyClass2 {
public void run() {
// this stuff will run in thread when thread's start() method is called
}
}
但它不会是Runnable
。因此,您不能将其发送到线程:
new Thread(new MyClass2()).start();
在这种情况下,您将收到编译错误。编译器无法知道您的类确实实现了类似Runnable
中声明的方法。你必须声明这个(如第一种情况)。
答案 3 :(得分:1)
Runnable
只允许您的类在线程中运行。你仍然需要,例如一个java.util.concurrent.Executor
实际在实际线程中运行它。
但是,您可extend Thread
允许您拨打Thread.start()
。
要实际从实现接口中获取行为,您需要第二个对象检查使用反射实现接口的类的类路径,然后对该类执行某些操作。
答案 4 :(得分:0)
您的问题有两个方面:
Car
是一个界面,其中某些方法抽象定义汽车,那么任何实现Car
接口的类都必须定义汽车的方法。您可以自由地实施该行为。Runnable
的类比是不正确的。使Runnable
类充当线程的原因是Thread class
。 Runnable
只是指定一个类作为线程的合同。检查this post。 答案 5 :(得分:0)
这不是子类化行为。为了使用子类行为,您需要扩展该类。
W.r.t接口这些只是由类实现的模板/合同。为了让runnable工作,调用程序需要实例化一个线程,当线程启动时,它将调用你的类实现的run方法。
答案 6 :(得分:0)
我总是想知道如何通过实现接口,子类获取行为。
它没有'获得'任何'行为'。子类提供行为。实现接口的工作是提供编译时类型签名,以便您可以使用指定接口的子类。