我可以为接口创建对象吗?

时间:2013-07-01 09:00:30

标签: java

是否可以为界面创建对象,如果是,我们怎么办? 根据我的观点,以下代码说我们可以:

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

7 个答案:

答案 0 :(得分:17)

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

    Runnable runnable = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

        }
    };

您实际上是在创建一个实现Runnable接口的类。 您需要遵循此处的所有规则,在此处,我们将覆盖Runnable

的运行方法
 There is similar thing for abstract class also. We can test using an example

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

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

答案 1 :(得分:12)

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

public class RunClass implements Runnable {
    // Class implementation
}

Runnable r = new RunClass();

这与你在线的内容基本相同。新的Runnable()之后的括号将包含您的实现内联。

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:7)

  

是否可以为界面创建对象?

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


“anonymous”类生成的实际上具有一个名称,该名称基于此代码所在的类的名称,例如YourClass$1或类似名称。 E.g:

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

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

...输出

AnonymousName$1

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

答案 4 :(得分:2)

这是我的理解。

界面

public Interface SomeInterface{
}

您可以为接口声明一个Object。

SomeInterface anObject;

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

public class SomeClass implements SomeInterface {}

然后你可以这样做,

anObject = new someClass();

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

我会更新到为什么我们正在做这件事/我一眼就知道了什么。

注意:上面的答案中已经提到了一些,只是希望OP也知道这一切。

答案 5 :(得分:0)

我们无法实例化接口(科学没有构造函数)。

答案 6 :(得分:0)

您看到的是anonymous inner class

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

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