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

kal*_*ish 13 java

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

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

Pra*_*kar 18

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

    Runnable runnable = new Runnable() {

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

        }
    };
Run Code Online (Sandbox Code Playgroud)

您实际上是创建一个实现Runnable接口的类.你需要遵循这里的所有规则,在这里,我们重写了run方法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");
    }

}
Run Code Online (Sandbox Code Playgroud)

和另一个类别 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将创建我们重写的子类的实例someMethod(); 这个程序打印

concrete class method
Run Code Online (Sandbox Code Playgroud)

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


JRE*_*REN 13

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

public class RunClass implements Runnable {
    // Class implementation
}

Runnable r = new RunClass();
Run Code Online (Sandbox Code Playgroud)

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

  • 这有点误导.OP的问题使用匿名类语法,这可能就是重点. (5认同)

Uwe*_*nus 8

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

Runnable r = new Runnable() {
    @Override
    public void run() {
    }
};
Run Code Online (Sandbox Code Playgroud)

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


T.J*_*der 7

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

不会.您显示的代码会从匿名类创建一个对象,该类实现该接口.在幕后,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());
    }
}
Run Code Online (Sandbox Code Playgroud)

...输出

AnonymousName$1

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