13

是否可以为接口创建对象?如果是,它是如何完成的?根据我的观点,以下代码表明我们可以:

Runnable r = new Runnable() {
    // some implementation
}
4

7 回答 7

19

这不是创建接口的实例,而是创建一个实现接口的类。所以当你写:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
};

您实际上是在创建一个实现 Runnable 接口的类。你需要遵守这里的所有规则,在这里,我们重写了 .run 方法Runnable。抽象类也有类似的东西。我们可以用一个例子来测试:

public abstract class AbstractClass {
    public void someMethod() {
        System.out.println("abstract class");
    }
}

和另一个类,即TestClass

public class TestClass {
    public static void main(String[] args) {
        AbstractClass abstractClass = new AbstractClass() {
            public void someMethod() {
                System.out.println("concrete class method");
            }
        };
        abstractClass.someMethod();
    }
}

这将创建我们要覆盖的子类的实例someMethod();该程序打印:

concrete class method

这证明我们正在创建子类的实例。

于 2013-07-01T09:01:51.573 回答
13

您不能直接实例化接口,但可以实例化实现该接口的类:

public class RunClass implements Runnable {
    // Class implementation
}

Runnable r = new RunClass();

这与您在内联所做的基本相同。new Runnable() 之后的括号将包含您的内联实现。

于 2013-07-01T09:01:37.923 回答
9

您可以创建一个匿名内部类:

Runnable r = new Runnable() {
    @Override
    public void run() {
    }
};

因此,您创建一个新class的实现给定的interface.

于 2013-07-01T09:03:40.393 回答
8

是否可以为接口创建对象?

不,您显示的代码从实现接口的匿名类创建了一个对象。在幕后,JVM 实际上创建了一个实现接口的类,然后创建该类的实例。


生成的“匿名”类实际上有一个名称,该名称基于此代码出现的类的名称,例如YourClass$1或类似名称。例如:

public class AnonymousName {
    public static final void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
            }
        };

        System.out.println(r.getClass().getName());
    }
}

...输出

匿名姓名$1

(至少在 Oracle 的 JVM 上;我不知道命名约定是在 JLS 中还是特定于 JVM 的行为。)

于 2013-07-01T09:02:36.410 回答
3

这是我的理解。

一个界面

public Interface SomeInterface{
}

您可以为接口声明一个对象。

SomeInterface anObject;

您不能使用此接口直接实例化此对象。但是,假设您有一个实现此接口的类。

public class SomeClass implements SomeInterface {}

然后你可以这样做,

anObject = new someClass();

(这当然是概念上的(如伪代码)实际代码可能会因您的类和访问修饰符等而异。)

我会在我发现后立即更新我们为什么要这样做/重点是什么。

注意:上面的答案中已经提到了其中的一些,只是想让 OP 也知道整个事情。

于 2018-04-02T06:10:24.940 回答
0

我们不能实例化接口(因为没有构造函数)。

于 2013-07-01T09:03:15.603 回答
0

你看到的是一个 匿名的内部类

它正在创建一个新的、匿名的 Runnable 类的实现者的实例。

因为匿名类定义是一个表达式,所以它必须是语句的一部分。

于 2013-07-01T09:15:11.467 回答