如何通过实现接口子类获取行为

时间:2013-06-03 09:48:03

标签: java interface implements

我总是想知道如何通过实现接口,子类获取行为。例如,如果我实现Runnable接口,我的子类开始表现为线程,但是如果我实现接口Runnable中定义的所有方法但不写“实现Runnable”,则子类不表现为Thread。与EventListeners相同。请帮我理解这个行为。

7 个答案:

答案 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)

您的问题有两个方面:

  1. 作为合同的接口:接口在实现它的类上强制执行行为合同。例如,如果Car是一个界面,其中某些方法抽象定义汽车,那么任何实现Car接口的类都必须定义汽车的方法。您可以自由地实施该行为。
  2. 作为线程的Runnable的类比是不正确的。使Runnable类充当线程的原因是Thread classRunnable只是指定一个类作为线程的合同。检查this post

答案 5 :(得分:0)

这不是子类化行为。为了使用子类行为,您需要扩展该类。

W.r.t接口这些只是由类实现的模板/合同。为了让runnable工作,调用程序需要实例化一个线程,当线程启动时,它将调用你的类实现的run方法。

答案 6 :(得分:0)

  

我总是想知道如何通过实现接口,子类获取行为。

它没有'获得'任何'行为'。子类提供行为。实现接口的工作是提供编译时类型签名,以便您可以使用指定接口的子类。