Java中,我们能否创建一个接口的实例?

85

在Java中,是否可以创建接口的实例?

我在某个地方读到,使用内部匿名类可以像下面这样做:

interface Test {
    public void wish();
}

class Main {
    public static void main(String[] args) {
        Test t = new Test() {
            public void wish() {
                System.out.println("output: hello how r u");
            }
        };
        t.wish();
    }
}

cmd> javac Main.java
cmd> java Main
output: hello how r u

这里的内容正确吗?

7个回答

96

在Java中,您永远无法实例化一个接口。但是,您可以通过接口类型引用实现该接口的对象。例如:

public interface A
{
}
public class B implements A
{
}

public static void main(String[] args)
{
    A test = new B();
    //A test = new A(); // wont compile
}

你上面所做的是创建了一个实现该接口的匿名类。你正在创建一个匿名对象,而不是类型为interface Test的对象。


13
匿名类没有名称.... 匿名的意思是没有特定的名字。 - jjnguy
1
他问他的例子是否正确,确实如此。不确定您是否已经确认了... - rsenna
4
这个例子是起作用的...但不像他想象的那样。重要的是要理解代码真正的运行方式。如果代码与他所认为的不同,我不会称其为“正确”的。 - Chad La Guardia
2
如果您查看上面的其中一条评论,您会发现语法要求 interface-name,以便编译器知道匿名对象实现了接口。这只是语言语法的一部分。 - Chad La Guardia
@ChadLaGuardia 很好的解释!直戳要点! - Thor
显示剩余10条评论

63

是的,你的例子是正确的。匿名类可以实现接口,这是我所能想到的唯一情况,其中一个类实现接口没有使用“implements”关键字。请看这里的另一个代码示例:

interface ProgrammerInterview {
    public void read();
}

class Website {
    ProgrammerInterview p = new ProgrammerInterview() {
        public void read() {
            System.out.println("interface ProgrammerInterview class implementer");
        }
    };
}

这个工作很好。取自于这个页面:

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/


1
这段代码能否编译通过?据我所知,接口是无法实例化的,但是在你的回答中,通过 ProgrammerInterview p = new ProgrammerInterview () { 这行代码实现了。 - Kasun Siyambalapitiya
2
在上面的例子中,我们没有实例化ProgrammerInterview的对象,而是使用ProgrammerInterview创建了一个引用,然后创建了一个匿名类的对象。这个匿名类实现了ProgrammerInterview接口,并一次性创建了匿名类的对象。 - Sargam Modak
3
但是你不是在调用new ProgrammerInterview() {...}吗?从技术上讲,你正在创建一个接口的实例。我仍然有点困惑这里发生了什么。 - user5228393
如果这个匿名类 ProgrammerInterview 是在 main() 方法内创建的,那么我们可以通过调用 p.read() 来访问它的方法 read() - Ram

6

通常情况下,您可以为接口创建一个引用。但是您不能为接口创建一个实例。


1
这正是我所需要的。 - Karthick K

4

1
我会说不...因为匿名实现了接口...但你没有implements关键字。 - user5650203

3

在我的看法中,您可以创建一个接口的引用变量,但是您不能像抽象类一样创建接口的实例。


0

没错,我们可以。“匿名类使您的代码更简洁。它们允许您同时声明和实例化一个类。它们像本地类一样,但没有名称”->>Java Doc


0

是的,没错。你可以使用内部类来实现。


尽管没有解释,但这似乎是最正确的答案。对于Android程序员来说,谷歌在此提供了一个实例,演示了一个类实例化一个内部接口。请点击此处查看:https://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents - SMBiggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接